Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
00001 /* 00002 00003 Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of version 2.1 of the GNU Lesser General Public License 00007 as published by the Free Software Foundation. 00008 00009 This program is distributed in the hope that it would be useful, but 00010 WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00012 00013 Further, this software is distributed without any warranty that it is 00014 free of the rightful claim of any third person regarding infringement 00015 or the like. Any license provided herein, whether implied or 00016 otherwise, applies only to this software file. Patent licenses, if 00017 any, provided herein do not apply to combinations of this program with 00018 other software, or any other product whatsoever. 00019 00020 You should have received a copy of the GNU Lesser General Public 00021 License along with this program; if not, write the Free Software 00022 Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, 00023 USA. 00024 00025 Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, 00026 Mountain View, CA 94043, or: 00027 00028 http://www.sgi.com 00029 00030 For further information regarding this notice, see: 00031 00032 http://oss.sgi.com/projects/GenInfo/NoticeExplan 00033 00034 */ 00035 00036 00037 #pragma ident "@(#) libfi/element/merge.c 92.1 07/08/99 15:50:39" 00038 00039 #include <stdlib.h> 00040 #include <liberrno.h> 00041 #include <cray/dopevec.h> 00042 #include <cray/portdefs.h> 00043 00044 #define DVSUBTYPE_DOUBLE 9 00045 #define DVSUBTYPE_DBLCOMPLEX 10 00046 00047 typedef struct { 00048 _f_real16 re; /* real part */ 00049 _f_real16 im; /* imaginary part */ 00050 } dblcmplx; 00051 00052 #define INCREMENT_N() \ 00053 curdim[0]++; \ 00054 if (curdim[0] < msk_ext[0]) { \ 00055 mindx += msk_incr[0]; \ 00056 findx += fls_incr[0]; \ 00057 rindx += res_incr[0]; \ 00058 tindx += tru_incr[0]; \ 00059 } else { \ 00060 curdim[0] = 0; \ 00061 curdim[1]++; \ 00062 if (curdim[1] < msk_ext[1]) { \ 00063 mindx += msk_incr[1]; \ 00064 findx += fls_incr[1]; \ 00065 rindx += res_incr[1]; \ 00066 tindx += tru_incr[1]; \ 00067 } else { \ 00068 curdim[1] = 0; \ 00069 curdim[2]++; \ 00070 if (curdim[2] < msk_ext[2]) { \ 00071 mindx += msk_incr[2]; \ 00072 findx += fls_incr[2]; \ 00073 rindx += res_incr[2]; \ 00074 tindx += tru_incr[2]; \ 00075 } else { \ 00076 curdim[2] = 0; \ 00077 curdim[3]++; \ 00078 if (curdim[3] < msk_ext[3]) { \ 00079 mindx += msk_incr[3]; \ 00080 findx += fls_incr[3]; \ 00081 rindx += res_incr[3]; \ 00082 tindx += tru_incr[3]; \ 00083 } else { \ 00084 curdim[3] = 0; \ 00085 curdim[4]++; \ 00086 if (curdim[4] < msk_ext[4]) { \ 00087 mindx += msk_incr[4]; \ 00088 findx += fls_incr[4]; \ 00089 rindx += res_incr[4]; \ 00090 tindx += tru_incr[4]; \ 00091 } else { \ 00092 curdim[4] = 0; \ 00093 curdim[5]++; \ 00094 if (curdim[5] < msk_ext[5]) { \ 00095 mindx += msk_incr[5]; \ 00096 findx += fls_incr[5]; \ 00097 rindx += res_incr[5]; \ 00098 tindx += tru_incr[5]; \ 00099 } else { \ 00100 curdim[5] = 0; \ 00101 curdim[6]++; \ 00102 mindx += msk_incr[6]; \ 00103 findx += fls_incr[6]; \ 00104 rindx += res_incr[6]; \ 00105 tindx += tru_incr[6]; \ 00106 } \ 00107 } \ 00108 } \ 00109 } \ 00110 } \ 00111 } 00112 00113 void 00114 _MERGE (DopeVectorType * result, 00115 DopeVectorType * tsource, 00116 DopeVectorType * fsource, 00117 DopeVectorType * mask) 00118 00119 { 00120 char *cf; /* char ptr to fsource array */ 00121 char *ct; /* char ptr to tsource array */ 00122 char *cr; /* char ptr to result array */ 00123 int chrlenf; /* length from fsource */ 00124 int chrlenr; /* length from result */ 00125 char * restrict cptr1; /* char */ 00126 unsigned long * restrict uptr1; /* unsigned */ 00127 _f_real16 * restrict dptr1; /* double */ 00128 dblcmplx * restrict xptr1; /* double cmplx */ 00129 char * restrict cptr2; /* char */ 00130 unsigned long * restrict uptr2; /* unsigned */ 00131 _f_real16 * restrict dptr2; /* double */ 00132 dblcmplx * restrict xptr2; /* double cmplx */ 00133 char * restrict cptr3; /* char */ 00134 unsigned long * restrict uptr3; /* unsigned */ 00135 _f_real16 * restrict dptr3; /* double */ 00136 dblcmplx * restrict xptr3; /* double cmplx */ 00137 _f_int * restrict iptr4; /* int */ 00138 unsigned long * restrict fptr; /* fsource */ 00139 unsigned long * restrict rptr; /* result */ 00140 unsigned long * restrict tptr; /* tsource */ 00141 unsigned long * restrict mptr; /* mask */ 00142 int bucketsize; /* size of element */ 00143 int nbytes; /* number of bytes */ 00144 int nwords; /* number of words */ 00145 int curdim[7]; /* current indices */ 00146 int bytealligned; /* byte aligned flag */ 00147 int findx; /* fsource index */ 00148 int rindx; /* result index */ 00149 int mindx; /* mask index */ 00150 int tindx; /* tsource index */ 00151 int type; /* data type */ 00152 int rank; /* rank of result matrix */ 00153 int i, j, k; /* index variables */ 00154 int fls_ext[MAXDIM]; /* extents for fsource */ 00155 int fls_strd[MAXDIM]; /* element stride for field */ 00156 int fls_incr[MAXDIM]; /* incr for each index */ 00157 int msk_ext[MAXDIM]; /* extents for fsource */ 00158 int msk_strd[MAXDIM]; /* element stride for field */ 00159 int msk_incr[MAXDIM]; /* incr for each index */ 00160 int res_ext[MAXDIM]; /* extents for fsource */ 00161 int res_strd[MAXDIM]; /* element stride for field */ 00162 int res_incr[MAXDIM]; /* incr for each index */ 00163 int tru_ext[MAXDIM]; /* extents for fsource */ 00164 int tru_strd[MAXDIM]; /* element stride for field */ 00165 int tru_incr[MAXDIM]; /* incr for each index */ 00166 int fls_cum_decr; /* fsource cumulative decrement */ 00167 int msk_cum_decr; /* mask cumulative decrement */ 00168 int res_cum_decr; /* result cumulative decrement */ 00169 int tru_cum_decr; /* tsource cumulative decrement */ 00170 int tot_ext; /* total extent counter */ 00171 int msk_0_strd; /* scaler stride variable */ 00172 int res_0_strd; /* scaler stride variable */ 00173 int tru_0_strd; /* scaler stride variable */ 00174 int fls_0_strd; /* scaler stride variable */ 00175 int one; /* index holder */ 00176 int zero; /* index holder */ 00177 00178 /* Set type and rank global variables */ 00179 00180 type = fsource->type_lens.type; 00181 rank = mask->n_dim; 00182 00183 /* 00184 * Initialize every element of every array to try and minimize problem 00185 * in compiler. 00186 */ 00187 00188 for (i = 0; i < MAXDIM; i++) { 00189 fls_ext[i] = 0; 00190 fls_strd[i] = 0; 00191 fls_incr[i] = 0; 00192 msk_ext[i] = 0; 00193 msk_strd[i] = 0; 00194 msk_incr[i] = 0; 00195 res_ext[i] = 0; 00196 res_strd[i] = 0; 00197 res_incr[i] = 0; 00198 tru_ext[i] = 0; 00199 tru_strd[i] = 0; 00200 tru_incr[i] = 0; 00201 } 00202 00203 /* Size calculation is based on variable type */ 00204 00205 switch (type) { 00206 case DVTYPE_ASCII : 00207 bytealligned = 1; 00208 bucketsize = _fcdlen (fsource->base_addr.charptr); 00209 break; 00210 case DVTYPE_DERIVEDBYTE : 00211 bytealligned = 1; 00212 #ifndef _ADDR64 00213 bucketsize = fsource->base_addr.a.el_len >> 3; /* bytes */ 00214 #else 00215 bucketsize = _fcdlen (fsource->base_addr.charptr);/* bytes */ 00216 #endif 00217 break; 00218 case DVTYPE_DERIVEDWORD : 00219 bytealligned = 0; 00220 #ifndef _ADDR64 00221 bucketsize = fsource->base_addr.a.el_len >> 6; /* words */ 00222 #else 00223 bucketsize = _fcdlen (fsource->base_addr.charptr);/* bytes */ 00224 bucketsize >>= 3; /* words */ 00225 #endif 00226 break; 00227 default : 00228 bytealligned = 0; 00229 bucketsize = fsource->type_lens.int_len >> 6; /* words */ 00230 } 00231 00232 /* Set up dope vector for result array */ 00233 00234 if (!result->assoc) { 00235 result->base_addr.a.ptr = (void *) NULL; 00236 result->orig_base = 0; 00237 result->orig_size = 0; 00238 for (i = 0; i < rank; i++) { 00239 result->dimension[i].extent = mask->dimension[i].extent; 00240 result->dimension[i].low_bound = 1; 00241 result->dimension[i].stride_mult = 00242 mask->dimension[i].stride_mult * bucketsize; 00243 } 00244 00245 /* Determine size of space to allocate */ 00246 00247 if (!bytealligned) 00248 nbytes = bucketsize << 3; 00249 else 00250 nbytes = bucketsize; 00251 for (i = 0; i < rank; i++) 00252 nbytes *= mask->dimension[i].extent; 00253 nwords = nbytes >> 3; 00254 result->base_addr.a.ptr = (void *) malloc (nbytes); 00255 if (result->base_addr.a.ptr == NULL) 00256 _lerror (_LELVL_ABORT, FENOMEMY); 00257 00258 result->assoc = 1; 00259 if (bytealligned) { 00260 cr = (char *) result->base_addr.a.ptr; 00261 result->base_addr.charptr = _cptofcd (cr, bucketsize); 00262 } 00263 result->orig_base = (void *) result->base_addr.a.ptr; 00264 result->orig_size = nwords; 00265 } else { 00266 if (bytealligned) { 00267 cr = _fcdtocp (result->base_addr.charptr); 00268 bucketsize = _fcdlen (result->base_addr.charptr); 00269 } 00270 } 00271 00272 /* Set up subtypes for double precision and double complex */ 00273 00274 if (type == DVTYPE_REAL && bucketsize == 2) 00275 type = DVSUBTYPE_DOUBLE; 00276 else if (type == DVTYPE_COMPLEX && bucketsize == 4) 00277 type = DVSUBTYPE_DBLCOMPLEX; 00278 00279 /* Set up scalar pointers to all of the argument data areas */ 00280 00281 if (!bytealligned) { 00282 fptr = (void *) fsource->base_addr.a.ptr; 00283 rptr = (void *) result->base_addr.a.ptr; 00284 tptr = (void *) tsource->base_addr.a.ptr; 00285 } else { 00286 cf = _fcdtocp (fsource->base_addr.charptr); 00287 ct = _fcdtocp (tsource->base_addr.charptr); 00288 cr = _fcdtocp (result->base_addr.charptr); 00289 } 00290 mptr = (void *) mask->base_addr.a.ptr; 00291 00292 msk_0_strd = mask->dimension[0].stride_mult; 00293 if (type == DVTYPE_COMPLEX || type == DVSUBTYPE_DOUBLE) { 00294 res_0_strd = result->dimension[0].stride_mult / 2; 00295 tru_0_strd = tsource->dimension[0].stride_mult / 2; 00296 fls_0_strd = fsource->dimension[0].stride_mult / 2; 00297 } else if (type == DVSUBTYPE_DBLCOMPLEX) { 00298 res_0_strd = result->dimension[0].stride_mult / 4; 00299 tru_0_strd = tsource->dimension[0].stride_mult / 4; 00300 fls_0_strd = fsource->dimension[0].stride_mult / 4; 00301 } else { 00302 res_0_strd = result->dimension[0].stride_mult; 00303 tru_0_strd = tsource->dimension[0].stride_mult; 00304 fls_0_strd = fsource->dimension[0].stride_mult; 00305 } 00306 00307 tot_ext = 1; 00308 #pragma _CRI novector 00309 for (i = 0; i < rank; i++) 00310 tot_ext *= msk_ext[i]; 00311 00312 if (rank == 1) { 00313 switch (type) { 00314 case DVTYPE_INTEGER : 00315 case DVTYPE_REAL : 00316 case DVTYPE_LOGICAL : 00317 uptr1 = (unsigned long *) tptr; 00318 uptr2 = (unsigned long *) fptr; 00319 uptr3 = (unsigned long *) rptr; 00320 iptr4 = (_f_int *) mptr; 00321 for (i = 0; i < tot_ext; i++) { 00322 mindx = i * msk_0_strd; 00323 rindx = i * res_0_strd; 00324 if (_ltob(&iptr4[mindx])) { 00325 tindx = i * tru_0_strd; 00326 uptr3[rindx] = uptr1[tindx]; 00327 } else { 00328 findx = i * fls_0_strd; 00329 uptr3[rindx] = uptr2[findx]; 00330 } 00331 } 00332 break; 00333 00334 case DVTYPE_COMPLEX : 00335 case DVSUBTYPE_DOUBLE : 00336 dptr1 = (_f_real16 *) tptr; 00337 dptr2 = (_f_real16 *) fptr; 00338 dptr3 = (_f_real16 *) rptr; 00339 iptr4 = (_f_int *) mptr; 00340 for (i = 0; i < tot_ext; i++) { 00341 mindx = i * msk_0_strd; 00342 rindx = i * res_0_strd; 00343 if (_ltob(&iptr4[mindx])) { 00344 tindx = i * tru_0_strd; 00345 dptr3[rindx] = dptr1[tindx]; 00346 } else { 00347 findx = i * fls_0_strd; 00348 dptr3[rindx] = dptr2[findx]; 00349 } 00350 } 00351 break; 00352 00353 case DVSUBTYPE_DBLCOMPLEX : 00354 xptr1 = (dblcmplx *) tptr; 00355 xptr2 = (dblcmplx *) fptr; 00356 xptr3 = (dblcmplx *) rptr; 00357 iptr4 = (_f_int *) mptr; 00358 for (i = 0; i < tot_ext; i++) { 00359 mindx = i * msk_0_strd; 00360 if (_ltob(&iptr4[mindx])) { 00361 rindx = i * res_0_strd; 00362 tindx = i * tru_0_strd; 00363 xptr3[rindx].re = xptr1[tindx].re; 00364 xptr3[rindx].im = xptr1[tindx].im; 00365 } else { 00366 rindx = i * res_0_strd; 00367 findx = i * fls_0_strd; 00368 xptr3[rindx].re = xptr2[findx].re; 00369 xptr3[rindx].im = xptr2[findx].im; 00370 } 00371 } 00372 break; 00373 00374 case DVTYPE_ASCII : 00375 case DVTYPE_DERIVEDBYTE : 00376 iptr4 = (_f_int *) mptr; 00377 for (i = 0; i < tot_ext; i++) { 00378 mindx = i * msk_0_strd; 00379 rindx = i * res_0_strd; 00380 if (_ltob(&iptr4[mindx])) { 00381 tindx = i * tru_0_strd; 00382 cptr3 = (char *) cr + rindx; 00383 cptr1 = (char *) ct + tindx; 00384 (void) memcpy (cptr3, cptr1, bucketsize); 00385 } else { 00386 findx = i * fls_0_strd; 00387 cptr3 = (char *) cr + rindx; 00388 cptr2 = (char *) cf + findx; 00389 (void) memcpy (cptr3, cptr2, bucketsize); 00390 } 00391 } 00392 break; 00393 00394 default : 00395 uptr1 = (unsigned long *) tptr; 00396 uptr2 = (unsigned long *) fptr; 00397 uptr3 = (unsigned long *) rptr; 00398 iptr4 = (_f_int *) mptr; 00399 for (i = 0; i < tot_ext; i++) { 00400 mindx = i * msk_0_strd; 00401 rindx = i * res_0_strd; 00402 if (_ltob(&iptr4[mindx])) { 00403 tindx = i * tru_0_strd; 00404 for (j = 0; j < bucketsize; j++) 00405 uptr3[rindx+j] = uptr1[tindx+j]; 00406 } else { 00407 findx = i * fls_0_strd; 00408 for (j = 0; j < bucketsize; j++) 00409 uptr3[rindx+j] = uptr2[findx+j]; 00410 } 00411 } 00412 break; 00413 } 00414 } else if (rank == 2) { 00415 if (mask->dimension[0].extent < mask->dimension[1].extent) { 00416 zero = 0; 00417 one = 1; 00418 } else { 00419 zero = 1; 00420 one = 0; 00421 } 00422 msk_ext[zero] = mask->dimension[0].extent; 00423 msk_ext[one] = mask->dimension[1].extent; 00424 msk_strd[zero] = mask->dimension[0].stride_mult; 00425 msk_strd[one] = mask->dimension[1].stride_mult; 00426 if (type == DVTYPE_COMPLEX || type == DVSUBTYPE_DOUBLE) { 00427 res_strd[zero] = result->dimension[0].stride_mult / 2; 00428 res_strd[one] = result->dimension[1].stride_mult / 2; 00429 } else if (type == DVSUBTYPE_DBLCOMPLEX) { 00430 res_strd[zero] = result->dimension[0].stride_mult / 4; 00431 res_strd[one] = result->dimension[1].stride_mult / 4; 00432 } else { 00433 res_strd[zero] = result->dimension[0].stride_mult; 00434 res_strd[one] = result->dimension[1].stride_mult; 00435 } 00436 if (tsource->n_dim > 0) { 00437 if (type == DVTYPE_COMPLEX || type == DVSUBTYPE_DOUBLE) { 00438 tru_strd[zero] = tsource->dimension[0].stride_mult / 2; 00439 tru_strd[one] = tsource->dimension[1].stride_mult / 2; 00440 } else if (type == DVSUBTYPE_DBLCOMPLEX) { 00441 tru_strd[zero] = tsource->dimension[0].stride_mult / 4; 00442 tru_strd[one] = tsource->dimension[1].stride_mult / 4; 00443 } else { 00444 tru_strd[zero] = tsource->dimension[0].stride_mult; 00445 tru_strd[one] = tsource->dimension[1].stride_mult; 00446 } 00447 } else { 00448 tru_strd[zero] = 0; 00449 tru_strd[one] = 0; 00450 } 00451 if (fsource->n_dim > 0) { 00452 if (type == DVTYPE_COMPLEX || type == DVSUBTYPE_DOUBLE) { 00453 fls_strd[zero] = fsource->dimension[0].stride_mult / 2; 00454 fls_strd[one] = fsource->dimension[1].stride_mult / 2; 00455 } else if (type == DVSUBTYPE_DBLCOMPLEX) { 00456 fls_strd[zero] = fsource->dimension[0].stride_mult / 4; 00457 fls_strd[one] = fsource->dimension[1].stride_mult / 4; 00458 } else { 00459 fls_strd[zero] = fsource->dimension[0].stride_mult; 00460 fls_strd[one] = fsource->dimension[1].stride_mult; 00461 } 00462 } else { 00463 fls_strd[zero] = 0; 00464 fls_strd[one] = 0; 00465 } 00466 00467 switch (type) { 00468 case DVTYPE_INTEGER : 00469 case DVTYPE_REAL : 00470 case DVTYPE_LOGICAL : 00471 for (i = 0; i < msk_ext[0]; i++) { 00472 uptr1 = (unsigned long *) tptr; 00473 uptr2 = (unsigned long *) fptr; 00474 uptr3 = (unsigned long *) rptr; 00475 iptr4 = (_f_int *) mptr + (i * msk_strd[0]); 00476 for (j = 0; j < msk_ext[1]; j++) { 00477 mindx = j * msk_strd[1]; 00478 if (_ltob(&iptr4[mindx])) { 00479 rindx = j * res_strd[1]; 00480 tindx = j * tru_strd[1]; 00481 uptr3[rindx] = uptr1[tindx]; 00482 } else { 00483 rindx = j * res_strd[1]; 00484 findx = j * fls_strd[1]; 00485 uptr3[rindx] = uptr2[findx]; 00486 } 00487 } 00488 } 00489 break; 00490 00491 case DVTYPE_COMPLEX : 00492 case DVSUBTYPE_DOUBLE : 00493 for (i = 0; i < msk_ext[0]; i++) { 00494 dptr1 = (_f_real16 *) tptr; 00495 dptr2 = (_f_real16 *) fptr; 00496 dptr3 = (_f_real16 *) rptr; 00497 iptr4 = (_f_int *) mptr + (i * msk_strd[0]); 00498 for (j = 0; j < msk_ext[1]; j++) { 00499 mindx = j * msk_strd[1]; 00500 if (_ltob(&iptr4[mindx])) { 00501 rindx = j * res_strd[1]; 00502 tindx = j * tru_strd[1]; 00503 dptr3[rindx] = dptr1[tindx]; 00504 } else { 00505 rindx = j * res_strd[1]; 00506 findx = j * fls_strd[1]; 00507 dptr3[rindx] = dptr2[findx]; 00508 } 00509 } 00510 } 00511 break; 00512 00513 case DVSUBTYPE_DBLCOMPLEX : 00514 for (i = 0; i < msk_ext[0]; i++) { 00515 xptr1 = (dblcmplx *) tptr; 00516 xptr2 = (dblcmplx *) fptr; 00517 xptr3 = (dblcmplx *) rptr; 00518 iptr4 = (_f_int *) mptr + (i * msk_strd[0]); 00519 for (j = 0; j < msk_ext[1]; j++) { 00520 mindx = j * msk_strd[1]; 00521 if (_ltob(&iptr4[mindx])) { 00522 rindx = j * res_strd[1]; 00523 tindx = j * tru_strd[1]; 00524 xptr3[rindx].re = xptr1[tindx].re; 00525 xptr3[rindx].im = xptr1[tindx].im; 00526 } else { 00527 rindx = j * res_strd[1]; 00528 findx = j * fls_strd[1]; 00529 xptr3[rindx].re = xptr2[findx].re; 00530 xptr3[rindx].im = xptr2[findx].im; 00531 } 00532 } 00533 } 00534 break; 00535 00536 case DVTYPE_ASCII : 00537 case DVTYPE_DERIVEDBYTE : 00538 for (i = 0; i < msk_ext[0]; i++) { 00539 iptr4 = (_f_int *) mptr + (i * msk_strd[0]); 00540 for (j = 0; j < msk_ext[1]; j++) { 00541 mindx = j * msk_strd[1]; 00542 if (_ltob(&iptr4[mindx])) { 00543 rindx = j * res_strd[1]; 00544 tindx = j * tru_strd[1]; 00545 cptr1 = (char *) ct + tindx; 00546 cptr3 = (char *) cr + rindx; 00547 (void) memcpy (cptr3, cptr1, bucketsize); 00548 } else { 00549 rindx = j * res_strd[1]; 00550 findx = j * fls_strd[1]; 00551 cptr2 = (char *) cf + findx; 00552 cptr3 = (char *) cr + rindx; 00553 (void) memcpy (cptr3, cptr2, bucketsize); 00554 } 00555 } 00556 } 00557 break; 00558 00559 default : 00560 for (i = 0; i < msk_ext[0]; i++) { 00561 uptr1 = (unsigned long *) tptr; 00562 uptr2 = (unsigned long *) fptr; 00563 uptr3 = (unsigned long *) rptr; 00564 iptr4 = (_f_int *) mptr; 00565 for (j = 0; j < msk_ext[1]; j++) { 00566 mindx = j * msk_strd[1]; 00567 if (_ltob(&iptr4[mindx])) { 00568 rindx = j * res_strd[1]; 00569 tindx = j * tru_strd[1]; 00570 for (k = 0; k < bucketsize; k++) 00571 uptr3[rindx+k] = uptr1[tindx+k]; 00572 } else { 00573 rindx = j * res_strd[1]; 00574 findx = j * fls_strd[1]; 00575 for (k = 0; k < bucketsize; k++) 00576 uptr3[rindx+k] = uptr2[findx+k]; 00577 } 00578 } 00579 } 00580 } 00581 } else { 00582 mindx = 0; 00583 findx = 0; 00584 rindx = 0; 00585 tindx = 0; 00586 #pragma _CRI shortloop 00587 for (i = 0; i < rank; i++) 00588 curdim[i] = 0; 00589 00590 #pragma _CRI shortloop 00591 for (i = 0; i < rank; i++) { 00592 if (type == DVTYPE_COMPLEX || type == DVSUBTYPE_DOUBLE) 00593 res_strd[i] = result->dimension[i].stride_mult / 2; 00594 else if (type == DVSUBTYPE_DBLCOMPLEX) 00595 res_strd[i] = result->dimension[i].stride_mult / 4; 00596 else 00597 res_strd[i] = result->dimension[i].stride_mult; 00598 } 00599 00600 if (fsource->n_dim > 0) { 00601 #pragma _CRI shortloop 00602 for (i = 0; i < rank; i++) { 00603 if (type == DVTYPE_COMPLEX || type == DVSUBTYPE_DOUBLE) 00604 fls_strd[i] = fsource->dimension[i].stride_mult / 2; 00605 else if (type == DVSUBTYPE_DBLCOMPLEX) 00606 fls_strd[i] = fsource->dimension[i].stride_mult / 4; 00607 else 00608 fls_strd[i] = fsource->dimension[i].stride_mult; 00609 } 00610 } else { 00611 #pragma _CRI shortloop 00612 for (i = 0; i < rank; i++) 00613 fls_strd[i] = 0; 00614 } 00615 00616 if (tsource->n_dim > 0) { 00617 #pragma _CRI shortloop 00618 for (i = 0; i < rank; i++) { 00619 if (type == DVTYPE_COMPLEX || type == DVSUBTYPE_DOUBLE) 00620 tru_strd[i] = tsource->dimension[i].stride_mult / 2; 00621 else if (type == DVSUBTYPE_DBLCOMPLEX) 00622 tru_strd[i] = tsource->dimension[i].stride_mult / 4; 00623 else 00624 tru_strd[i] = tsource->dimension[i].stride_mult; 00625 } 00626 } else { 00627 #pragma _CRI shortloop 00628 for (i = 0; i < rank; i++) 00629 tru_strd[i] = 0; 00630 } 00631 00632 msk_incr[0] = msk_strd[0]; 00633 msk_cum_decr = 0; 00634 fls_incr[0] = fls_strd[0]; 00635 fls_cum_decr = 0; 00636 res_incr[0] = res_strd[0]; 00637 res_cum_decr = 0; 00638 tru_incr[0] = tru_strd[0]; 00639 tru_cum_decr = 0; 00640 00641 #pragma _CRI novector 00642 for (i = 1; i < rank; i++) { 00643 msk_cum_decr += (msk_ext[i-1] - 1) * msk_strd[i-1]; 00644 msk_incr[i] = msk_strd[i] - msk_cum_decr; 00645 fls_cum_decr += (fls_ext[i-1] - 1) * fls_strd[i-1]; 00646 fls_incr[i] = fls_strd[i] - fls_cum_decr; 00647 res_cum_decr += (res_ext[i-1] - 1) * res_strd[i-1]; 00648 res_incr[i] = res_strd[i] - res_cum_decr; 00649 tru_cum_decr += (tru_ext[i-1] - 1) * tru_strd[i-1]; 00650 tru_incr[i] = tru_strd[i] - tru_cum_decr; 00651 } 00652 00653 iptr4 = (_f_int *) mptr + mindx; 00654 switch (type) { 00655 case DVTYPE_INTEGER : 00656 case DVTYPE_REAL : 00657 case DVTYPE_LOGICAL : 00658 uptr1 = (unsigned long *) fptr; 00659 uptr2 = (unsigned long *) tptr; 00660 uptr3 = (unsigned long *) rptr; 00661 for (i = 0; i < tot_ext; i++) { 00662 if (_ltob(&iptr4[mindx])) { 00663 uptr3[rindx] = uptr2[tindx]; 00664 } else { 00665 uptr3[rindx] = uptr1[findx]; 00666 } 00667 INCREMENT_N(); 00668 } 00669 break; 00670 00671 case DVTYPE_COMPLEX : 00672 case DVSUBTYPE_DOUBLE : 00673 dptr1 = (_f_real16 *) fptr; 00674 dptr2 = (_f_real16 *) tptr; 00675 dptr3 = (_f_real16 *) rptr; 00676 for (i = 0; i < tot_ext; i++) { 00677 if (_ltob(&iptr4[mindx])) { 00678 dptr3[rindx] = dptr2[tindx]; 00679 } else { 00680 dptr3[rindx] = dptr1[findx]; 00681 } 00682 INCREMENT_N(); 00683 } 00684 break; 00685 00686 case DVTYPE_ASCII : 00687 case DVTYPE_DERIVEDBYTE : 00688 for (i = 0; i < tot_ext; i++) { 00689 cptr3 = (char *) cr + rindx; 00690 if (_ltob(&iptr4[mindx])) { 00691 cptr2 = (char *) ct + tindx; 00692 (void) memcpy (cptr3, cptr2, bucketsize); 00693 } else { 00694 cptr1 = (char *) cf + findx; 00695 (void) memcpy (cptr3, cptr1, bucketsize); 00696 } 00697 INCREMENT_N(); 00698 } 00699 break; 00700 00701 case DVSUBTYPE_DBLCOMPLEX : 00702 xptr1 = (dblcmplx *) fptr; 00703 xptr2 = (dblcmplx *) tptr; 00704 xptr3 = (dblcmplx *) rptr; 00705 for (i = 0; i < tot_ext; i++) { 00706 if (_ltob(&iptr4[mindx])) { 00707 xptr3[rindx].re = xptr2[tindx].re; 00708 xptr3[rindx].im = xptr2[tindx].im; 00709 } else { 00710 xptr3[rindx].re = xptr1[findx].re; 00711 xptr3[rindx].im = xptr1[findx].im; 00712 } 00713 INCREMENT_N(); 00714 } 00715 break; 00716 00717 default : 00718 uptr1 = (unsigned long *) fptr; 00719 uptr2 = (unsigned long *) tptr; 00720 uptr3 = (unsigned long *) rptr; 00721 for (i = 0; i < tot_ext; i++) { 00722 if (_ltob(&iptr4[mindx])) { 00723 for (j = 0; j < bucketsize; j++) 00724 uptr3[rindx+j] = uptr2[tindx+j]; 00725 } else { 00726 for (j = 0; j < bucketsize; j++) 00727 uptr3[rindx+j] = uptr1[findx+j]; 00728 } 00729 INCREMENT_N(); 00730 } 00731 } 00732 } 00733 }