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/array/count.c 92.1 07/07/99 15:52:02" 00038 #include <stddef.h> 00039 #include <stdlib.h> 00040 #include <liberrno.h> 00041 #include <cray/dopevec.h> 00042 #include <cray/portdefs.h> 00043 #include "logical.h" 00044 00045 /* COUNT returns default type integer of kind=8 */ 00046 00047 #ifdef _UNICOS 00048 #pragma _CRI duplicate _COUNT as COUNT@ 00049 #endif 00050 void 00051 _COUNT (DopeVectorType * result, 00052 DopeVectorType * mask, 00053 _f_int *dimension) 00054 { 00055 void __count(); 00056 (void) __count (result, mask, dimension); 00057 } 00058 00059 #ifdef _UNICOS 00060 #pragma _CRI duplicate _COUNT0 as COUNT0@ 00061 #endif 00062 _f_int 00063 _COUNT0(DopeVectorType * mask, 00064 _f_int *dimension) 00065 { 00066 void __count(); 00067 DopeVectorType result, *res_ptr; 00068 _f_int intres; 00069 00070 res_ptr = (DopeVectorType *) &result; 00071 res_ptr->base_addr.a.ptr = &intres; 00072 res_ptr->base_addr.a.el_len = sizeof(_f_int8) * BITS_PER_BYTE; 00073 res_ptr->assoc = 1; 00074 res_ptr->ptr_alloc = 0; 00075 res_ptr->p_or_a = NOT_P_OR_A; 00076 res_ptr->n_dim = 0; 00077 res_ptr->type_lens.type = DVTYPE_INTEGER; 00078 res_ptr->type_lens.dpflag = 0; 00079 res_ptr->type_lens.kind_or_star = DVD_DEFAULT; 00080 res_ptr->type_lens.int_len = sizeof(_f_int8) * BITS_PER_BYTE; 00081 res_ptr->type_lens.dec_len = 0; 00082 res_ptr->orig_base = res_ptr->base_addr.a.ptr; 00083 res_ptr->orig_size = 0; 00084 __count (res_ptr, mask, dimension); 00085 return (*(_f_int *) res_ptr->base_addr.a.ptr); 00086 } 00087 00088 00089 void 00090 _COUNT_4 (DopeVectorType * result, 00091 DopeVectorType * mask, 00092 _f_int *dimension) 00093 { 00094 void __count(); 00095 (void) __count (result, mask, dimension); 00096 } 00097 00098 _f_int 00099 _COUNT0_4(DopeVectorType * mask, 00100 _f_int *dimension) 00101 { 00102 void __count(); 00103 DopeVectorType result, *res_ptr; 00104 _f_int intres; 00105 00106 res_ptr = (DopeVectorType *) &result; 00107 res_ptr->base_addr.a.ptr = &intres; 00108 res_ptr->base_addr.a.el_len = sizeof(_f_int) * BITS_PER_BYTE; 00109 res_ptr->assoc = 1; 00110 res_ptr->ptr_alloc = 0; 00111 res_ptr->p_or_a = NOT_P_OR_A; 00112 res_ptr->n_dim = 0; 00113 res_ptr->type_lens.type = DVTYPE_INTEGER; 00114 res_ptr->type_lens.dpflag = 0; 00115 res_ptr->type_lens.kind_or_star = DVD_DEFAULT; 00116 res_ptr->type_lens.int_len = sizeof(_f_int4) * BITS_PER_BYTE; 00117 res_ptr->type_lens.dec_len = 0; 00118 res_ptr->orig_base = res_ptr->base_addr.a.ptr; 00119 res_ptr->orig_size = 0; 00120 __count (res_ptr, mask, dimension); 00121 return (*(_f_int4 *) res_ptr->base_addr.a.ptr); 00122 } 00123 00124 00125 void 00126 _COUNT_8 (DopeVectorType * result, 00127 DopeVectorType * mask, 00128 _f_int *dimension) 00129 { 00130 void __count(); 00131 (void) __count (result, mask, dimension); 00132 } 00133 00134 _f_int 00135 _COUNT0_8(DopeVectorType * mask, 00136 _f_int *dimension) 00137 { 00138 void __count(); 00139 DopeVectorType result, *res_ptr; 00140 _f_int8 intres; 00141 00142 res_ptr = (DopeVectorType *) &result; 00143 res_ptr->base_addr.a.ptr = &intres; 00144 res_ptr->base_addr.a.el_len = sizeof(_f_int8) * BITS_PER_BYTE; 00145 res_ptr->assoc = 1; 00146 res_ptr->ptr_alloc = 0; 00147 res_ptr->p_or_a = NOT_P_OR_A; 00148 res_ptr->n_dim = 0; 00149 res_ptr->type_lens.type = DVTYPE_INTEGER; 00150 res_ptr->type_lens.dpflag = 0; 00151 res_ptr->type_lens.kind_or_star = DVD_DEFAULT; 00152 res_ptr->type_lens.int_len = sizeof(_f_int8) * BITS_PER_BYTE; 00153 res_ptr->type_lens.dec_len = 0; 00154 res_ptr->orig_base = res_ptr->base_addr.a.ptr; 00155 res_ptr->orig_size = 0; 00156 __count (res_ptr, mask, dimension); 00157 return (*(_f_int8 *) res_ptr->base_addr.a.ptr); 00158 } 00159 00160 00161 void 00162 _COUNT_1 (DopeVectorType * result, 00163 DopeVectorType * mask, 00164 _f_int *dimension) 00165 { 00166 void __count(); 00167 (void) __count (result, mask, dimension); 00168 } 00169 00170 _f_int1 00171 _COUNT0_1(DopeVectorType * mask, 00172 _f_int *dimension) 00173 { 00174 void __count(); 00175 DopeVectorType result, *res_ptr; 00176 _f_int1 intres; 00177 00178 res_ptr = (DopeVectorType *) &result; 00179 res_ptr->base_addr.a.ptr = &intres; 00180 res_ptr->base_addr.a.el_len = sizeof(_f_int1) * BITS_PER_BYTE; 00181 res_ptr->assoc = 1; 00182 res_ptr->ptr_alloc = 0; 00183 res_ptr->p_or_a = NOT_P_OR_A; 00184 res_ptr->n_dim = 0; 00185 res_ptr->type_lens.type = DVTYPE_INTEGER; 00186 res_ptr->type_lens.dpflag = 0; 00187 res_ptr->type_lens.kind_or_star = DVD_DEFAULT; 00188 res_ptr->type_lens.int_len = sizeof(_f_int1) * BITS_PER_BYTE; 00189 res_ptr->type_lens.dec_len = 0; 00190 res_ptr->orig_base = res_ptr->base_addr.a.ptr; 00191 res_ptr->orig_size = 0; 00192 __count (res_ptr, mask, dimension); 00193 return (*(_f_int1 *) res_ptr->base_addr.a.ptr); 00194 } 00195 00196 00197 void 00198 _COUNT_2 (DopeVectorType * result, 00199 DopeVectorType * mask, 00200 _f_int *dimension) 00201 { 00202 void __count(); 00203 (void) __count (result, mask, dimension); 00204 } 00205 00206 _f_int2 00207 _COUNT0_2(DopeVectorType * mask, 00208 _f_int *dimension) 00209 { 00210 void __count(); 00211 DopeVectorType result, *res_ptr; 00212 _f_int2 intres; 00213 00214 res_ptr = (DopeVectorType *) &result; 00215 res_ptr->base_addr.a.ptr = &intres; 00216 res_ptr->base_addr.a.el_len = sizeof(_f_int2) * BITS_PER_BYTE; 00217 res_ptr->assoc = 1; 00218 res_ptr->ptr_alloc = 0; 00219 res_ptr->p_or_a = NOT_P_OR_A; 00220 res_ptr->n_dim = 0; 00221 res_ptr->type_lens.type = DVTYPE_INTEGER; 00222 res_ptr->type_lens.dpflag = 0; 00223 res_ptr->type_lens.kind_or_star = DVD_DEFAULT; 00224 res_ptr->type_lens.int_len = sizeof(_f_int2) * BITS_PER_BYTE; 00225 res_ptr->type_lens.dec_len = 0; 00226 res_ptr->orig_base = res_ptr->base_addr.a.ptr; 00227 res_ptr->orig_size = 0; 00228 __count (res_ptr, mask, dimension); 00229 return (*(_f_int2 *) res_ptr->base_addr.a.ptr); 00230 } 00231 00232 00233 void 00234 __count (DopeVectorType * result, 00235 DopeVectorType * mask, 00236 _f_int *dimension) 00237 { 00238 int c_dim; /* C form of input dimension */ 00239 int other_dim; /* other dimension in rank-2 */ 00240 int num_strides = 1; /* strides through mask array */ 00241 int num_elts = 1; /* elements in result array */ 00242 long nbytes = 0; /* bytes to malloc */ 00243 long trues; /* number of true elements */ 00244 _f_int * rptr; /* ptr to result array */ 00245 #ifdef _F_INT1 00246 _f_int1 * i1rptr; /* ptr to result array */ 00247 _f_log1 * i1mptr; /* ptr to mask array */ 00248 #endif 00249 #ifdef _F_INT2 00250 _f_int2 * i2rptr; /* ptr to result array */ 00251 _f_log2 * i2mptr; /* ptr to mask array */ 00252 #endif 00253 _f_int4 * i4rptr; /* ptr to result array */ 00254 _f_int8 * i8rptr; /* ptr to result array */ 00255 _f_log * imptr; /* ptr to mask array */ 00256 _f_log4 * i4mptr; /* ptr to mask array */ 00257 _f_log8 * i8mptr; /* ptr to mask array */ 00258 long i, j; /* index variables */ 00259 long indx, jndx; /* loop indices */ 00260 int done; /* work done indicator */ 00261 int el_len; /* LTOB length indicator */ 00262 int mshftct=0; /* mask amount to shift index */ 00263 int rshftct=0; /* result amount to shift index */ 00264 00265 /* Per-dimension arrays */ 00266 long current_place[MAXDIM-1]; /* current place*/ 00267 long mask_offset[MAXDIM-1]; /* mask offset */ 00268 long mask_extent[MAXDIM-1]; /* mask extent */ 00269 long mask_stride[MAXDIM-1]; /* mask stride */ 00270 long result_offset[MAXDIM-1]; /* result offset*/ 00271 long result_stride[MAXDIM-1]; /* result stride*/ 00272 long cdim_mask_stride; /* cdim stride */ 00273 00274 /* Validate dimension variable */ 00275 if (dimension != NULL && mask->n_dim > 1) { 00276 c_dim = *dimension - 1; 00277 if (c_dim < 0 || c_dim >= mask->n_dim) 00278 _lerror (_LELVL_ABORT, FESCIDIM); 00279 } else { 00280 c_dim = 0; 00281 if (dimension != NULL) { 00282 if (*dimension < 1 || *dimension > mask->n_dim) 00283 _lerror (_LELVL_ABORT, FESCIDIM); 00284 } 00285 } 00286 00287 /* Setup dope vector for result array */ 00288 if (!result->assoc) { 00289 int sm = 1; 00290 if (result->base_addr.a.el_len >= BITS_PER_WORD) 00291 sm = result->base_addr.a.el_len / BITS_PER_WORD; 00292 for (i = 0; i < c_dim; i++) { 00293 if (dimension != NULL) { 00294 result->dimension[i].extent = 00295 mask->dimension[i].extent; 00296 result->dimension[i].low_bound = 1; 00297 result->dimension[i].stride_mult = 00298 num_strides * sm; 00299 } 00300 num_strides *= mask->dimension[i].extent; 00301 } 00302 for ( ; i < mask->n_dim - 1; i++) { 00303 if (dimension != NULL) { 00304 result->dimension[i].extent = 00305 mask->dimension[i+1].extent; 00306 result->dimension[i].low_bound = 1; 00307 result->dimension[i].stride_mult = 00308 num_strides * sm; 00309 } 00310 num_strides *= mask->dimension[i+1].extent; 00311 } 00312 if (dimension != NULL) 00313 num_elts = num_strides; 00314 00315 result->base_addr.a.ptr = (void *) NULL; 00316 00317 nbytes = ((num_elts * result->base_addr.a.el_len) / 00318 BITS_PER_BYTE); 00319 if (nbytes != 0) { 00320 result->base_addr.a.ptr = (void *) malloc (nbytes); 00321 if (result->base_addr.a.ptr == NULL) 00322 _lerror(_LELVL_ABORT, FENOMEMY); 00323 result->assoc = 1; 00324 } 00325 /* set fields for null array as well */ 00326 result->orig_base = result->base_addr.a.ptr; 00327 result->orig_size = nbytes * BITS_PER_BYTE; 00328 } else { 00329 int rank; 00330 rank = mask->n_dim; 00331 for (i = 0; i < rank-1; i++) 00332 num_strides *= mask->dimension[i+1].extent; 00333 } 00334 00335 00336 /* Set pointer to result array and initialize result 00337 * array to zeroes. 00338 */ 00339 rptr = (void *) result->base_addr.a.ptr; 00340 switch (result->type_lens.int_len) { 00341 case 64 : 00342 i8rptr = (_f_int8 *) rptr; 00343 #ifdef _F_INT4 00344 if (sizeof(_f_int) == sizeof(_f_log4)) 00345 rshftct = 1; 00346 #endif 00347 #ifdef _UNICOS 00348 #pragma _CRI ivdep 00349 #endif 00350 for (i = 0; i < num_elts; i++) 00351 i8rptr[i] = 0; 00352 break; 00353 #ifdef _F_INT2 00354 case 16 : 00355 i2rptr = (_f_int2 *) rptr; 00356 for (i = 0; i < num_elts; i++) 00357 i2rptr[i] = 0; 00358 break; 00359 #endif 00360 #ifdef _F_INT1 00361 case 8 : 00362 i1rptr = (_f_int1 *) rptr; 00363 for (i = 0; i < num_elts; i++) 00364 i1rptr[i] = 0; 00365 break; 00366 #endif 00367 case 32 : 00368 default : 00369 i4rptr = (_f_int4 *) rptr; 00370 #ifdef _UNICOS 00371 #pragma _CRI ivdep 00372 #endif 00373 for (i = 0; i < num_elts; i++) 00374 i4rptr[i] = 0; 00375 } 00376 00377 /* Set pointer to mask array and initialize el_len for LTOB */ 00378 00379 imptr = (void *) mask->base_addr.a.ptr; 00380 switch (mask->type_lens.int_len) { 00381 case 64 : 00382 el_len = sizeof(_f_log8) * BITS_PER_BYTE; 00383 i8mptr = (_f_log8 *) imptr; 00384 #ifdef _F_LOG4 00385 /* Set mask shftct for COUNT with no size specified 00386 * since no size means 64-bit logical value. A default 00387 * 32-bit logical has a stride_mult of two for 64-bit 00388 * logical on WORD32. Normally, the COUNT_8 entry point 00389 * is used. On MPP, the stride_mult is one for 32-bit 00390 * or 64-bit logical. 00391 */ 00392 if (sizeof(_f_int) == sizeof(_f_log4)) 00393 mshftct = 1; 00394 #endif 00395 break; 00396 #ifdef _F_LOG2 00397 case 16 : 00398 el_len = sizeof(_f_log2) * BITS_PER_BYTE; 00399 i2mptr = (_f_log2 *) imptr; 00400 break; 00401 #endif 00402 #ifdef _F_LOG1 00403 case 8 : 00404 el_len = sizeof(_f_log1) * BITS_PER_BYTE; 00405 i1mptr = (_f_log1 *) imptr; 00406 break; 00407 #endif 00408 case 32 : 00409 default : 00410 el_len = sizeof(_f_log4) * BITS_PER_BYTE; 00411 i4mptr = (_f_log4 *) imptr; 00412 } 00413 00414 /* Handle a rank-one mask array */ 00415 00416 if (mask->n_dim == 1) { 00417 /* Use local mask_stride and divide by two when two-word 00418 * logical is being done. 00419 */ 00420 #ifdef _F_LOG4 00421 mask_stride[0] = (mask->dimension[0].stride_mult) >> mshftct; 00422 #else 00423 mask_stride[0] = mask->dimension[0].stride_mult; 00424 #endif 00425 /* Scan array, counting TRUE elements */ 00426 trues = 0; 00427 for (i = 0; i < mask->dimension[0].extent; i++) { 00428 indx = i * mask_stride[0]; 00429 switch (mask->type_lens.int_len) { 00430 case 64 : 00431 if (LTOB(el_len, (i8mptr + indx))) { 00432 /* true element */ 00433 trues++; 00434 } 00435 break; 00436 #ifdef _F_LOG2 00437 case 16 : 00438 if (LTOB(el_len, (i2mptr + indx))) { 00439 /* true element */ 00440 trues++; 00441 } 00442 break; 00443 #endif 00444 #ifdef _F_LOG1 00445 case 8 : 00446 if (LTOB(el_len, (i1mptr + indx))) { 00447 /* true element */ 00448 trues++; 00449 } 00450 break; 00451 #endif 00452 case 32 : 00453 default : 00454 if (LTOB(el_len, (i4mptr + indx))) { 00455 /* true element */ 00456 trues++; 00457 } 00458 } 00459 } 00460 00461 /* store result depending on size of integer */ 00462 switch (result->type_lens.int_len) { 00463 case 64 : 00464 i8rptr[0] = trues; 00465 break; 00466 #ifdef _F_INT2 00467 case 16 : 00468 i2rptr[0] = trues; 00469 break; 00470 #endif 00471 #ifdef _F_INT1 00472 case 8 : 00473 i1rptr[0] = trues; 00474 break; 00475 #endif 00476 case 32 : 00477 default : 00478 i4rptr[0] = trues; 00479 } 00480 00481 /* Handle a rank-two mask array */ 00482 } else if (mask->n_dim == 2) { 00483 00484 /* Initialize data */ 00485 if (c_dim == 0) 00486 other_dim = 1; 00487 else 00488 other_dim = 0; 00489 #ifdef _F_LOG4 00490 mask_stride[0] = (mask->dimension[0].stride_mult) >> mshftct; 00491 mask_stride[1] = (mask->dimension[1].stride_mult) >> mshftct; 00492 #else 00493 mask_stride[0] = mask->dimension[0].stride_mult; 00494 mask_stride[1] = mask->dimension[1].stride_mult; 00495 #endif 00496 /* Scan array, counting TRUE elements */ 00497 trues = 0; 00498 for (i = 0; i < num_strides; i++) { 00499 indx = i * mask_stride[other_dim]; 00500 for (j = 0; j < mask->dimension[c_dim].extent; j++) { 00501 jndx = indx + j * 00502 mask_stride[c_dim]; 00503 switch (mask->type_lens.int_len) { 00504 case 64 : 00505 if (LTOB(el_len, (i8mptr + 00506 jndx))) { 00507 /* true element */ 00508 trues++; 00509 } 00510 break; 00511 #ifdef _F_LOG2 00512 case 16 : 00513 if (LTOB(el_len, (i2mptr + 00514 jndx))) { 00515 /* true element */ 00516 trues++; 00517 } 00518 break; 00519 #endif 00520 #ifdef _F_LOG1 00521 case 8 : 00522 if (LTOB(el_len, (i1mptr + 00523 jndx))) { 00524 /* true element */ 00525 trues++; 00526 } 00527 break; 00528 #endif 00529 case 32 : 00530 default : 00531 if (LTOB(el_len, (i4mptr + 00532 jndx))) { 00533 /* true element */ 00534 trues++; 00535 } 00536 } 00537 } 00538 00539 /* store result depending on size of integer */ 00540 if (result->n_dim != 0) { 00541 switch (result->type_lens.int_len) { 00542 case 64 : 00543 i8rptr[i] = trues; 00544 break; 00545 #ifdef _F_INT2 00546 case 16 : 00547 i2rptr[i] = trues; 00548 break; 00549 #endif 00550 #ifdef _F_INT1 00551 case 8 : 00552 i1rptr[i] = trues; 00553 break; 00554 #endif 00555 case 32 : 00556 default : 00557 i4rptr[i] = trues; 00558 } 00559 trues = 0; 00560 } 00561 } 00562 if (result->n_dim == 0) { 00563 switch (result->type_lens.int_len) { 00564 case 64 : 00565 i8rptr[0] = trues; 00566 break; 00567 #ifdef _F_INT2 00568 case 16 : 00569 i2rptr[0] = trues; 00570 break; 00571 #endif 00572 #ifdef _F_INT1 00573 case 8 : 00574 i1rptr[0] = trues; 00575 break; 00576 #endif 00577 case 32 : 00578 default : 00579 i4rptr[0] = trues; 00580 } 00581 } 00582 00583 /* Handle a rank-three through rank-seven mask array */ 00584 } else { 00585 00586 /* Initialize data */ 00587 if (result->n_dim != 0) 00588 #ifdef _UNICOS 00589 #pragma _CRI shortloop 00590 #endif 00591 for (i = 0; i < result->n_dim; i++) { 00592 result_offset[i] = 0; 00593 #ifdef _F_LOG4 00594 result_stride[i] = 00595 result->dimension[i].stride_mult >> rshftct; 00596 #else 00597 result_stride[i] = 00598 result->dimension[i].stride_mult; 00599 #endif 00600 } 00601 00602 /* Initialize mask parameters based on which dimension 00603 * has been requested 00604 */ 00605 if (c_dim == 0) 00606 i = 0; 00607 else 00608 #ifdef _UNICOS 00609 #pragma _CRI shortloop 00610 #endif 00611 for (i = 0; i < c_dim; i++) { 00612 current_place[i] = 0; 00613 mask_offset[i] = 0; 00614 mask_extent[i] = mask->dimension[i].extent; 00615 #ifdef _F_LOG4 00616 mask_stride[i] = 00617 (mask->dimension[i].stride_mult) >> mshftct; 00618 #else 00619 mask_stride[i] = mask->dimension[i].stride_mult; 00620 #endif 00621 } 00622 if (i < (mask->n_dim - 1)) 00623 #ifdef _UNICOS 00624 #pragma _CRI shortloop 00625 #endif 00626 for ( ; i < mask->n_dim - 1; i++) { 00627 current_place[i] = 0; 00628 mask_offset[i] = 0; 00629 mask_extent[i] = mask->dimension[i+1].extent; 00630 #ifdef _F_LOG4 00631 mask_stride[i] = 00632 (mask->dimension[i+1].stride_mult) >> mshftct; 00633 #else 00634 mask_stride[i] = mask->dimension[i+1].stride_mult; 00635 #endif 00636 } 00637 #ifdef _F_LOG4 00638 cdim_mask_stride = mask->dimension[c_dim].stride_mult >> mshftct; 00639 #else 00640 cdim_mask_stride = mask->dimension[c_dim].stride_mult; 00641 #endif 00642 00643 /* Scan array, counting TRUE elements */ 00644 00645 trues = 0; 00646 for (i = 0; i < num_strides; i++) { 00647 00648 /* Determine starting point */ 00649 00650 indx = 0; 00651 #ifdef _UNICOS 00652 #pragma _CRI shortloop 00653 #endif 00654 for (j = 0; j < mask->n_dim - 1; j++) 00655 indx += mask_offset[j]; 00656 00657 /* Scan array, counting TRUE elements */ 00658 for (j = 0; j < mask->dimension[c_dim].extent; j++) { 00659 jndx = indx + j * cdim_mask_stride; 00660 switch (mask->type_lens.int_len) { 00661 case 64 : 00662 if (LTOB(el_len, (i8mptr + 00663 jndx))) { 00664 /* true element */ 00665 trues++; 00666 } 00667 break; 00668 #ifdef _F_LOG2 00669 case 16 : 00670 if (LTOB(el_len, (i2mptr + 00671 jndx))) { 00672 /* true element */ 00673 trues++; 00674 } 00675 break; 00676 #endif 00677 #ifdef _F_LOG1 00678 case 8 : 00679 if (LTOB(el_len, (i1mptr + 00680 jndx))) { 00681 /* true element */ 00682 trues++; 00683 } 00684 break; 00685 #endif 00686 case 32 : 00687 default : 00688 if (LTOB(el_len, (i4mptr + 00689 jndx))) { 00690 /* true element */ 00691 trues++; 00692 } 00693 } 00694 } 00695 if (result->n_dim != 0) { 00696 indx = 0; 00697 #ifdef _UNICOS 00698 #pragma _CRI shortloop 00699 #endif 00700 for (j = 0; j < mask->n_dim - 1; j++) 00701 indx += result_offset[j]; 00702 00703 /* store result for size of integer */ 00704 switch (result->type_lens.int_len) { 00705 case 64 : 00706 i8rptr[indx] = trues; 00707 break; 00708 #ifdef _F_INT2 00709 case 16 : 00710 i2rptr[indx] = trues; 00711 break; 00712 #endif 00713 #ifdef _F_INT1 00714 case 8 : 00715 i1rptr[indx] = trues; 00716 break; 00717 #endif 00718 case 32 : 00719 default : 00720 i4rptr[indx] = trues; 00721 } 00722 trues = 0; 00723 } 00724 00725 /* Increment pointers for each dimension */ 00726 j = 0; 00727 done = FALSE; 00728 while (done == FALSE && j < mask->n_dim - 1) { 00729 if (current_place[j] == mask_extent[j] - 1) { 00730 current_place[j] = 0; 00731 mask_offset[j] = 0; 00732 if (result->n_dim != 0) 00733 result_offset[j] = 0; 00734 } else { 00735 current_place[j]++; 00736 mask_offset[j] = 00737 current_place[j] * mask_stride[j]; 00738 if (result->n_dim != 0) 00739 result_offset[j] = 00740 current_place[j] * 00741 result_stride[j]; 00742 done = TRUE; 00743 } 00744 j++; 00745 } 00746 } 00747 if (result->n_dim == 0) { 00748 /* store result for size of integer */ 00749 switch (result->type_lens.int_len) { 00750 case 64 : 00751 i8rptr[0] = trues; 00752 break; 00753 #ifdef _F_INT2 00754 case 16 : 00755 i2rptr[0] = trues; 00756 break; 00757 #endif 00758 #ifdef _F_INT1 00759 case 8 : 00760 i1rptr[0] = trues; 00761 break; 00762 #endif 00763 case 32 : 00764 default : 00765 i4rptr[0] = trues; 00766 } 00767 } 00768 } 00769 }