Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
all.c
Go to the documentation of this file.
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/all.c   92.1    07/07/99 15:52:02"
00038 #include <stddef.h>
00039 #include <liberrno.h>
00040 #include <cray/dopevec.h>
00041 #include <cray/portdefs.h>
00042 #include "logical.h"
00043 
00044 #ifdef _UNICOS
00045 #pragma _CRI duplicate _ALL as ALL@
00046 #endif
00047 void
00048 _ALL (  DopeVectorType * result,
00049         DopeVectorType * mask,
00050         _f_int  *dimension)
00051 {
00052         void __all();
00053         (void) __all (result, mask, dimension);
00054 }
00055 
00056 
00057 #ifdef _UNICOS
00058 #pragma _CRI duplicate _ALL0 as ALL0@
00059 #endif
00060 _f_log
00061 _ALL0 ( DopeVectorType * mask,
00062         _f_int  *dimension)
00063 {
00064         void __all();
00065         _f_log          logres;
00066         DopeVectorType  result, *res_ptr;
00067         
00068         res_ptr = (DopeVectorType *) &result;
00069         res_ptr->base_addr.a.ptr = &logres;
00070         res_ptr->base_addr.a.el_len = sizeof(_f_log8) * BITS_PER_BYTE;
00071         res_ptr->assoc = 1;
00072         res_ptr->ptr_alloc = 0;
00073         res_ptr->p_or_a = NOT_P_OR_A;
00074         res_ptr->n_dim = 0;
00075         res_ptr->type_lens.type = DVTYPE_LOGICAL;
00076         res_ptr->type_lens.dpflag = 0;
00077         res_ptr->type_lens.kind_or_star = DVD_DEFAULT;
00078         res_ptr->type_lens.int_len = sizeof(_f_log8) * BITS_PER_BYTE;
00079         res_ptr->type_lens.dec_len = 0;
00080         res_ptr->orig_base = res_ptr->base_addr.a.ptr;
00081         res_ptr->orig_size = 0;
00082         __all (res_ptr, mask, dimension);
00083         return(*(_f_log *) res_ptr->base_addr.a.ptr);
00084 }
00085 
00086 
00087 void
00088 _ALL_4 (DopeVectorType * result,
00089         DopeVectorType * mask,
00090         _f_int  *dimension)
00091 {
00092         void __all();
00093         (void) __all (result, mask, dimension);
00094 }
00095 
00096 _f_log4
00097 _ALL0_4 (DopeVectorType * mask,
00098         _f_int  *dimension)
00099 {
00100         void __all();
00101         _f_log4         log4res;
00102         DopeVectorType  result, *res_ptr;
00103         
00104         res_ptr = (DopeVectorType *) &result;
00105         res_ptr->base_addr.a.ptr = &log4res;
00106         res_ptr->base_addr.a.el_len = sizeof(_f_log4) * BITS_PER_BYTE;
00107         res_ptr->assoc = 1;
00108         res_ptr->ptr_alloc = 0;
00109         res_ptr->p_or_a = NOT_P_OR_A;
00110         res_ptr->n_dim = 0;
00111         res_ptr->type_lens.type = DVTYPE_LOGICAL;
00112         res_ptr->type_lens.dpflag = 0;
00113         res_ptr->type_lens.kind_or_star = DVD_DEFAULT;
00114         res_ptr->type_lens.int_len = sizeof(_f_log4) * BITS_PER_BYTE;
00115         res_ptr->type_lens.dec_len = 0;
00116         res_ptr->orig_base =  res_ptr->base_addr.a.ptr;
00117         res_ptr->orig_size = 0;
00118         __all (res_ptr, mask, dimension);
00119         return(*(_f_log4 *) res_ptr->base_addr.a.ptr);
00120 }
00121 
00122 
00123 void
00124 _ALL_8 (DopeVectorType * result,
00125         DopeVectorType * mask,
00126         _f_int  *dimension)
00127 {
00128         void __all();
00129         (void) __all (result, mask, dimension);
00130 }
00131 
00132 _f_log8
00133 _ALL0_8 (DopeVectorType * mask,
00134         _f_int  *dimension)
00135 {
00136         void __all();
00137         _f_log8         log8res;
00138         DopeVectorType  result, *res_ptr;
00139         
00140         res_ptr = (DopeVectorType *) &result;
00141         res_ptr->base_addr.a.ptr = &log8res;
00142         res_ptr->base_addr.a.el_len = sizeof(_f_log8) * BITS_PER_BYTE;
00143         res_ptr->assoc = 1;
00144         res_ptr->ptr_alloc = 0;
00145         res_ptr->p_or_a = NOT_P_OR_A;
00146         res_ptr->n_dim = 0;
00147         res_ptr->type_lens.type = DVTYPE_LOGICAL;
00148         res_ptr->type_lens.dpflag = 0;
00149         res_ptr->type_lens.kind_or_star = DVD_DEFAULT;
00150         res_ptr->type_lens.int_len = sizeof(_f_log8) * BITS_PER_BYTE;
00151         res_ptr->type_lens.dec_len = 0;
00152         res_ptr->orig_base =  res_ptr->base_addr.a.ptr;
00153         res_ptr->orig_size = 0;
00154         __all (res_ptr, mask, dimension);
00155         return(*(_f_log8 *) res_ptr->base_addr.a.ptr);
00156 }
00157 
00158 
00159 void
00160 _ALL_2 (DopeVectorType * result,
00161         DopeVectorType * mask,
00162         _f_int  *dimension)
00163 {
00164         void __all();
00165         (void) __all (result, mask, dimension);
00166 }
00167 
00168 _f_log2
00169 _ALL0_2 (DopeVectorType * mask,
00170         _f_int  *dimension)
00171 {
00172         void __all();
00173         _f_log2         log2res;
00174         DopeVectorType  result, *res_ptr;
00175         
00176         res_ptr = (DopeVectorType *) &result;
00177         res_ptr->base_addr.a.ptr = &log2res;
00178         res_ptr->base_addr.a.el_len = sizeof(_f_log2) * BITS_PER_BYTE;
00179         res_ptr->assoc = 1;
00180         res_ptr->ptr_alloc = 0;
00181         res_ptr->p_or_a = NOT_P_OR_A;
00182         res_ptr->n_dim = 0;
00183         res_ptr->type_lens.type = DVTYPE_LOGICAL;
00184         res_ptr->type_lens.dpflag = 0;
00185         res_ptr->type_lens.kind_or_star = DVD_DEFAULT;
00186         res_ptr->type_lens.int_len = sizeof(_f_log2) * BITS_PER_BYTE;
00187         res_ptr->type_lens.dec_len = 0;
00188         res_ptr->orig_base =  res_ptr->base_addr.a.ptr;
00189         res_ptr->orig_size = 0;
00190         __all (res_ptr, mask, dimension);
00191         return(*(_f_log2 *) res_ptr->base_addr.a.ptr);
00192 }
00193 
00194 
00195 void
00196 _ALL_1 (DopeVectorType * result,
00197         DopeVectorType * mask,
00198         _f_int  *dimension)
00199 {
00200         void __all();
00201         (void) __all (result, mask, dimension);
00202 }
00203 
00204 _f_log1
00205 _ALL0_1 (DopeVectorType * mask,
00206         _f_int  *dimension)
00207 {
00208         void __all();
00209         _f_log1         log1res;
00210         DopeVectorType  result, *res_ptr;
00211         
00212         res_ptr = (DopeVectorType *) &result;
00213         res_ptr->base_addr.a.ptr = &log1res;
00214         res_ptr->base_addr.a.el_len = sizeof(_f_log1) * BITS_PER_BYTE;
00215         res_ptr->assoc = 1;
00216         res_ptr->ptr_alloc = 0;
00217         res_ptr->p_or_a = NOT_P_OR_A;
00218         res_ptr->n_dim = 0;
00219         res_ptr->type_lens.type = DVTYPE_LOGICAL;
00220         res_ptr->type_lens.dpflag = 0;
00221         res_ptr->type_lens.kind_or_star = DVD_DEFAULT;
00222         res_ptr->type_lens.int_len = sizeof(_f_log1) * BITS_PER_BYTE;
00223         res_ptr->type_lens.dec_len = 0;
00224         res_ptr->orig_base =  res_ptr->base_addr.a.ptr;
00225         res_ptr->orig_size = 0;
00226         __all (res_ptr, mask, dimension);
00227         return(*(_f_log1 *) res_ptr->base_addr.a.ptr);
00228 }
00229 
00230 
00231 void
00232 __all  (        DopeVectorType * result,
00233         DopeVectorType * mask,
00234         _f_int  *dimension)
00235 {
00236         int     c_dim;          /* C form of input dimension    */
00237         int     other_dim;      /* other dimension in rank-2    */
00238         int     num_elts =       1;     /* elts in result array */
00239         long    nbytes =         0;     /* bytes to malloc      */
00240         _f_log * irptr;         /* ptr to result array  */
00241         _f_log * imptr;         /* ptr to mask array    */
00242         _f_log4 * i4rptr;       /* ptr to result array  */
00243         _f_log4 * i4mptr;       /* ptr to mask array    */
00244         _f_log8 * i8rptr;       /* ptr to result array  */
00245         _f_log8 * i8mptr;       /* ptr to mask array    */
00246 #ifdef  _F_LOG1
00247         _f_log1 * i1rptr;       /* ptr to result array  */
00248         _f_log1 * i1mptr;       /* ptr to mask array    */
00249 #endif
00250 #ifdef  _F_LOG2
00251         _f_log2 * i2rptr;       /* ptr to result array  */
00252         _f_log2 * i2mptr;       /* ptr to mask array    */
00253 #endif
00254         long    i, j;           /* index variables              */
00255         long    indx, jndx;     /* loop indices                 */
00256         int     done, stop;     /* work done indicators         */
00257         int     el_len;         /* LTOB length indicator        */
00258         int     mshftct=0;      /* mask amount to shift index   */
00259         int     rshftct=0;      /* result amount to shift index */
00260 
00261         /*      Per-dimension arrays    */
00262         long    current_place[MAXDIM-1];        /* current place*/
00263         long    mask_offset[MAXDIM-1];          /* mask offset  */
00264         long    mask_extent[MAXDIM-1];          /* mask extent  */
00265         long    mask_stride[MAXDIM-1];          /* mask stride  */
00266         long    result_offset[MAXDIM-1];        /* result offset*/
00267         long    result_stride[MAXDIM-1];        /* result stride*/
00268         long    cdim_mask_stride;               /* cdim stride  */
00269 
00270         /* Validate dimension variable  */
00271         if (dimension != NULL && mask->n_dim > 1) {
00272                 c_dim = *dimension - 1;
00273                 if (c_dim < 0 || c_dim >= mask->n_dim)
00274                         _lerror (_LELVL_ABORT, FESCIDIM);
00275         } else {
00276                 c_dim = 0;
00277                 if (dimension != NULL) {
00278                         if (*dimension  < 1 || *dimension > mask->n_dim)
00279                                 _lerror (_LELVL_ABORT, FESCIDIM);
00280                 }
00281         }
00282 
00283         /* Setup dope vector for result array   */
00284         if (!result->assoc) {
00285                 int sm  = 1;
00286                 if (result->base_addr.a.el_len >= BITS_PER_WORD)
00287                         sm =    result->base_addr.a.el_len / BITS_PER_WORD;
00288                 if (dimension != NULL) {
00289                         for (i = 0; i < c_dim; i++) {
00290                                 result->dimension[i].extent =
00291                                         mask->dimension[i].extent;
00292                                 result->dimension[i].low_bound =        1;
00293                                 result->dimension[i].stride_mult =
00294                                         num_elts * sm;
00295                                 num_elts *=     mask->dimension[i].extent;
00296                         }
00297                         for ( ; i < result->n_dim; i++) {
00298                                 result->dimension[i].extent =
00299                                         mask->dimension[i+1].extent;
00300                                 result->dimension[i].low_bound =        1;
00301                                 result->dimension[i].stride_mult =
00302                                         num_elts * sm;
00303                                 num_elts *=     mask->dimension[i+1].extent;
00304                         }
00305                 }
00306 
00307                 result->base_addr.a.ptr =       (void *) NULL;
00308 
00309                 nbytes = ((num_elts * result->base_addr.a.el_len) /
00310                                 BITS_PER_BYTE);
00311                 if (nbytes != 0) {
00312                         result->base_addr.a.ptr = (void *) malloc (nbytes);
00313                         if (result->base_addr.a.ptr == NULL)
00314                                 _lerror(_LELVL_ABORT, FENOMEMY);
00315                         result->assoc = 1;
00316                 }
00317 
00318                 /* set fields for null array as well */
00319                 result->orig_base = result->base_addr.a.ptr;
00320                 result->orig_size = nbytes * BITS_PER_BYTE;
00321         }
00322 
00323         /* Set pointer to result array and initialize result array to TRUE */
00324         irptr =         (void *) result->base_addr.a.ptr;
00325         switch (result->type_lens.int_len) {
00326                 case 64 :
00327                         i8rptr = (_f_log8 *) result->base_addr.a.ptr;
00328 #ifdef _F_LOG4
00329                         if (sizeof(_f_int) == sizeof(_f_log4))
00330                                 rshftct =       1;
00331 #endif
00332 #ifdef _UNICOS
00333 #pragma _CRI     ivdep
00334 #endif
00335                         for (i = 0; i < num_elts; i++) {
00336                                 i8rptr[i] = (_f_log8) _btol(1);
00337                         }
00338                         break;
00339 #ifdef _F_LOG2
00340                 case 16 :
00341                         i2rptr = (_f_log2 *) result->base_addr.a.ptr;
00342                         for (i = 0; i < num_elts; i++) {
00343                                 i2rptr[i] = (_f_log2) _btol(1);
00344                         }
00345                         break;
00346 #endif
00347 #ifdef _F_LOG1
00348                 case 8 :
00349                         i1rptr = (_f_log1 *) result->base_addr.a.ptr;
00350                         for (i = 0; i < num_elts; i++) {
00351                                 i1rptr[i] = (_f_log1) _btol(1);
00352                         }
00353                         break;
00354 #endif
00355                 case 32 :
00356                 default :
00357                         i4rptr = (_f_log4 *) result->base_addr.a.ptr;
00358 #ifdef _UNICOS
00359 #pragma _CRI     ivdep
00360 #endif
00361                         for (i = 0; i < num_elts; i++) {
00362                                 i4rptr[i] = (_f_log4) _btol(1);
00363                         }
00364         }
00365 
00366         imptr =         (void *) mask->base_addr.a.ptr;
00367         switch (mask->type_lens.int_len) {
00368                 case 64 :
00369                         el_len =        sizeof(_f_log8) * BITS_PER_BYTE;
00370                         i8mptr =        (_f_log8 *) imptr;
00371 #ifdef _F_LOG4
00372                 /* Set mask shftct for ALL with no size specified since
00373                  * no size means a 64-bit logical value.  A default of
00374                  * 32-bit logical has a stride_mult of two for a 64-bit
00375                  * logical on WORD32.  Normally, the ALL_8 entry point
00376                  * is used.  On MPP, the stride_mult is one for 32-bit
00377                  * or 64-bit logical.
00378                  */
00379                         if (sizeof(_f_int) == sizeof(_f_log4))
00380                                 mshftct =       1;
00381 #endif
00382                         break;
00383 #ifdef _F_LOG2
00384                 case 16 :
00385                         el_len =        sizeof(_f_log2) * BITS_PER_BYTE;
00386                         i2mptr =        (_f_log2 *) imptr;
00387                         break;
00388 #endif
00389 #ifdef _F_LOG1
00390                 case 8 :
00391                         el_len =        sizeof(_f_log1) * BITS_PER_BYTE;
00392                         i1mptr =        (_f_log1 *) imptr;
00393                         break;
00394 #endif
00395                 case 32 :
00396                 default :
00397                         el_len =        sizeof(_f_log4) * BITS_PER_BYTE;
00398                         i4mptr =        (_f_log4 *) imptr;
00399         }
00400 
00401         /* check for zero-sized mask array */
00402         for (i = 0; i < mask->n_dim; i++) {
00403                 if (mask->dimension[i].extent == 0)
00404                         return;
00405         }
00406 
00407         /* Handle a rank-one mask array */
00408         if (mask->n_dim == 1) {
00409 
00410                 /* Use local mask_stride and divide by two when two-word
00411                  * logical is being done.
00412                  */
00413 #ifdef _F_LOG4
00414                 mask_stride[0] = (mask->dimension[0].stride_mult) >> mshftct;
00415 #else
00416                 mask_stride[0] = mask->dimension[0].stride_mult;
00417 #endif
00418         /* Scan array until a FALSE element is found */
00419                 i = 0;
00420                 indx = 0;
00421                 switch (mask->type_lens.int_len) {
00422                     case 64 :
00423                         while (i < mask->dimension[0].extent) {
00424                                 if (LTOB(el_len, (i8mptr + indx))) {
00425                                         /* true element */
00426                                         i++;
00427                                         indx = i * mask_stride[0];
00428                                 } else {
00429                                         /* false element */
00430                                         switch (result->type_lens.int_len) {
00431                                             case 64 :
00432                                                 i8rptr[0] = (_f_log8) _btol(0);
00433                                                 break;
00434 #ifdef _F_LOG2
00435                                             case 16 :
00436                                                 i2rptr[0] = (_f_log2) _btol(0);
00437                                                 break;
00438 #endif
00439 #ifdef _F_LOG1
00440                                             case 8 :
00441                                                 i1rptr[0] = (_f_log1) _btol(0);
00442                                                 break;
00443 #endif
00444                                             case 32 :
00445                                             default :
00446                                                 i4rptr[0] = (_f_log4) _btol(0);
00447                                         }
00448                                         i = mask->dimension[0].extent;
00449                                 }
00450                         }
00451                         break;
00452 #ifdef _F_LOG2
00453                     case 16 :
00454                         while (i < mask->dimension[0].extent) {
00455                                 if (LTOB(el_len, (i2mptr + indx))) {
00456                                         /* true element */
00457                                         i++;
00458                                         indx = i * mask_stride[0];
00459                                 } else {
00460                                         /* false element */
00461                                         switch (result->type_lens.int_len) {
00462                                             case 64 :
00463                                                 i8rptr[0] = (_f_log8) _btol(0);
00464                                                 break;
00465                                             case 16 :
00466                                                 i2rptr[0] = (_f_log2) _btol(0);
00467                                                 break;
00468 #ifdef _F_LOG1
00469                                             case 8 :
00470                                                 i1rptr[0] = (_f_log1) _btol(0);
00471                                                 break;
00472 #endif
00473                                             case 32 :
00474                                             default :
00475                                                 i4rptr[0] = (_f_log4) _btol(0);
00476                                         }
00477                                         i = mask->dimension[0].extent;
00478                                 }
00479                         }
00480                         break;
00481 #endif
00482 #ifdef _F_LOG1
00483                     case 8 :
00484                         while (i < mask->dimension[0].extent) {
00485                                 if (LTOB(el_len, (i1mptr + indx))) {
00486                                         /* true element */
00487                                         i++;
00488                                         indx = i * mask_stride[0];
00489                                 } else {
00490                                         /* false element */
00491                                         switch (result->type_lens.int_len) {
00492                                             case 64 :
00493                                                 i8rptr[0] = (_f_log8) _btol(0);
00494                                                 break;
00495                                             case 16 :
00496                                                 i2rptr[0] = (_f_log2) _btol(0);
00497                                                 break;
00498                                             case 8 :
00499                                                 i1rptr[0] = (_f_log1) _btol(0);
00500                                                 break;
00501                                             case 32 :
00502                                             default :
00503                                                 i4rptr[0] = (_f_log4) _btol(0);
00504                                         }
00505                                         i = mask->dimension[0].extent;
00506                                 }
00507                         }
00508                         break;
00509 #endif
00510                     case 32 :
00511                     default :
00512                         while (i < mask->dimension[0].extent) {
00513                                 if (LTOB(el_len, (i4mptr + indx))) {
00514                                         /* true element */
00515                                         i++;
00516                                         indx = i * mask_stride[0];
00517                                 } else {
00518                                         /* false element */
00519                                         switch (result->type_lens.int_len) {
00520                                             case 64 :
00521                                                 i8rptr[0] = (_f_log8) _btol(0);
00522                                                 break;
00523 #ifdef _F_LOG2
00524                                             case 16 :
00525                                                 i2rptr[0] = (_f_log2) _btol(0);
00526                                                 break;
00527 #endif
00528 #ifdef _F_LOG1
00529                                             case 8 :
00530                                                 i1rptr[0] = (_f_log1) _btol(0);
00531                                                 break;
00532 #endif
00533                                             case 32 :
00534                                             default :
00535                                                 i4rptr[0] = (_f_log4) _btol(0);
00536                                         }
00537                                         i = mask->dimension[0].extent;
00538                                 }
00539                         }
00540                 }
00541 
00542         /* Handle a rank-two mask array */
00543         } else if (mask->n_dim == 2) {
00544 
00545         /* Initialize data      */
00546                 if (c_dim == 0)
00547                         other_dim = 1;
00548                 else
00549                         other_dim = 0;
00550 #ifdef _F_LOG4
00551                 mask_stride[0] = (mask->dimension[0].stride_mult) >> mshftct;
00552                 mask_stride[1] = (mask->dimension[1].stride_mult) >> mshftct;
00553 #else
00554                 mask_stride[0] = mask->dimension[0].stride_mult;
00555                 mask_stride[1] = mask->dimension[1].stride_mult;
00556 #endif
00557          /* Scan array until a FALSE element is found */
00558                 i = 0;
00559                 indx = 0;
00560                 while (i < mask->dimension[other_dim].extent) {
00561                         j = 0;
00562                         jndx = indx;
00563                         switch (mask->type_lens.int_len) {
00564                             case 64 :
00565                                 while (j < mask->dimension[c_dim].extent) {
00566                                         if (LTOB(el_len, (i8mptr + jndx))) {
00567                                                 /* true element */
00568                                                 j++;
00569                                                 jndx = indx + j *
00570                                                   mask_stride[c_dim];
00571                                         } else {
00572                                                 /* false element */
00573                                                 if (result->n_dim == 0) {
00574                                                     switch (result->type_lens.int_len) {
00575                                                     case 64 :
00576                                                         i8rptr[0] = (_f_log8) _btol(0);
00577                                                         break;
00578 #ifdef _F_LOG2
00579                                                     case 16 :
00580                                                         i2rptr[0] = (_f_log2) _btol(0);
00581                                                         break;
00582 #endif
00583 #ifdef _F_LOG1
00584                                                     case 8 :
00585                                                         i1rptr[0] = (_f_log1) _btol(0);
00586                                                         break;
00587 #endif
00588                                                     case 32 :
00589                                                     default :
00590                                                         i4rptr[0] = (_f_log4) _btol(0);
00591                                                     }
00592                                                     j = mask->dimension[c_dim].extent;
00593                                                     i = mask->dimension[other_dim].extent;
00594                                                 } else {
00595                                                     switch (result->type_lens.int_len) {
00596                                                     case 64 :
00597                                                         i8rptr[i] = (_f_log8) _btol(0);
00598                                                         break;
00599 #ifdef _F_LOG2
00600                                                     case 16 :
00601                                                         i2rptr[i] = (_f_log2) _btol(0);
00602                                                         break;
00603 #endif
00604 #ifdef _F_LOG1
00605                                                     case 8 :
00606                                                         i1rptr[i] = (_f_log1) _btol(0);
00607                                                         break;
00608 #endif
00609                                                     case 32 :
00610                                                     default :
00611                                                         i4rptr[i] = (_f_log4) _btol(0);
00612                                                     }
00613                                                     j = mask->dimension[c_dim].extent;
00614                                                 }
00615                                         }
00616                                 }
00617                                 break;
00618 #ifdef _F_LOG2
00619                             case 16 :
00620                                 while (j < mask->dimension[c_dim].extent) {
00621                                         if (LTOB(el_len, (i2mptr + jndx))) {
00622                                                 /* true element */
00623                                                 j++;
00624                                                 jndx = indx + j *
00625                                                   mask_stride[c_dim];
00626                                         } else {
00627                                                 /* false element */
00628                                                 if (result->n_dim == 0) {
00629                                                     switch (result->type_lens.int_len) {
00630                                                     case 64 :
00631                                                         i8rptr[0] = (_f_log8) _btol(0);
00632                                                         break;
00633                                                     case 16 :
00634                                                         i2rptr[0] = (_f_log2) _btol(0);
00635                                                         break;
00636 #ifdef _F_LOG1
00637                                                     case 8 :
00638                                                         i1rptr[0] = (_f_log1) _btol(0);
00639                                                         break;
00640 #endif
00641                                                     case 32 :
00642                                                     default :
00643                                                         i4rptr[0] = (_f_log4) _btol(0);
00644                                                     }
00645                                                     j = mask->dimension[c_dim].extent;
00646                                                     i = mask->dimension[other_dim].extent;
00647                                                 } else {
00648                                                     switch (result->type_lens.int_len) {
00649                                                     case 64 :
00650                                                         i8rptr[i] = (_f_log8) _btol(0);
00651                                                         break;
00652                                                     case 16 :
00653                                                         i2rptr[i] = (_f_log2) _btol(0);
00654                                                         break;
00655 #ifdef _F_LOG1
00656                                                     case 8 :
00657                                                         i1rptr[i] = (_f_log1) _btol(0);
00658                                                         break;
00659 #endif
00660                                                     case 32 :
00661                                                     default :
00662                                                         i4rptr[i] = (_f_log4) _btol(0);
00663                                                     }
00664                                                     j = mask->dimension[c_dim].extent;
00665                                                 }
00666                                         }
00667                                 }
00668                                 break;
00669 #endif
00670 #ifdef _F_LOG1
00671                             case 8 :
00672                                 while (j < mask->dimension[c_dim].extent) {
00673                                         if (LTOB(el_len, (i1mptr + jndx))) {
00674                                                 /* true element */
00675                                                 j++;
00676                                                 jndx = indx + j *
00677                                                   mask_stride[c_dim];
00678                                         } else {
00679                                                 /* false element */
00680                                                 if (result->n_dim == 0) {
00681                                                     switch (result->type_lens.int_len) {
00682                                                     case 64 :
00683                                                         i8rptr[0] = (_f_log8) _btol(0);
00684                                                         break;
00685                                                     case 16 :
00686                                                         i2rptr[0] = (_f_log2) _btol(0);
00687                                                         break;
00688                                                     case 8 :
00689                                                         i1rptr[0] = (_f_log1) _btol(0);
00690                                                         break;
00691                                                     case 32 :
00692                                                     default :
00693                                                         i4rptr[0] = (_f_log4) _btol(0);
00694                                                     }
00695                                                     j = mask->dimension[c_dim].extent;
00696                                                     i = mask->dimension[other_dim].extent;
00697                                                 } else {
00698                                                     switch (result->type_lens.int_len) {
00699                                                     case 64 :
00700                                                         i8rptr[i] = (_f_log8) _btol(0);
00701                                                         break;
00702                                                     case 16 :
00703                                                         i2rptr[i] = (_f_log2) _btol(0);
00704                                                         break;
00705                                                     case 8 :
00706                                                         i1rptr[i] = (_f_log1) _btol(0);
00707                                                         break;
00708                                                     case 32 :
00709                                                     default :
00710                                                         i4rptr[i] = (_f_log4) _btol(0);
00711                                                     }
00712                                                     j = mask->dimension[c_dim].extent;
00713                                                 }
00714                                         }
00715                                 }
00716                                 break;
00717 #endif
00718                             case 32 :
00719                             default :
00720                                 while (j < mask->dimension[c_dim].extent) {
00721                                         if (LTOB(el_len, (i4mptr + jndx))) {
00722                                                 /* true element */
00723                                                 j++;
00724                                                 jndx = indx + j *
00725                                                   mask_stride[c_dim];
00726                                         } else {
00727                                                 /* false element */
00728                                                 if (result->n_dim == 0) {
00729                                                     switch (result->type_lens.int_len) {
00730                                                     case 64 :
00731                                                         i8rptr[0] = (_f_log8) _btol(0);
00732                                                         break;
00733 #ifdef _F_LOG2
00734                                                     case 16 :
00735                                                         i2rptr[0] = (_f_log2) _btol(0);
00736                                                         break;
00737 #endif
00738 #ifdef _F_LOG1
00739                                                     case 8 :
00740                                                         i1rptr[0] = (_f_log1) _btol(0);
00741                                                         break;
00742 #endif
00743                                                     case 32 :
00744                                                     default :
00745                                                         i4rptr[0] = (_f_log4) _btol(0);
00746                                                     }
00747                                                     j = mask->dimension[c_dim].extent;
00748                                                     i = mask->dimension[other_dim].extent;
00749                                                 } else {
00750                                                     switch (result->type_lens.int_len) {
00751                                                     case 64 :
00752                                                         i8rptr[i] = (_f_log8) _btol(0);
00753                                                         break;
00754 #ifdef _F_LOG2
00755                                                     case 16 :
00756                                                         i2rptr[i] = (_f_log2) _btol(0);
00757                                                         break;
00758 #endif
00759 #ifdef _F_LOG1
00760                                                     case 8 :
00761                                                         i1rptr[i] = (_f_log1) _btol(0);
00762                                                         break;
00763 #endif
00764                                                     case 32 :
00765                                                     default :
00766                                                         i4rptr[i] = (_f_log4) _btol(0);
00767                                                     }
00768                                                     j = mask->dimension[c_dim].extent;
00769                                                 }
00770                                         }
00771                                 }
00772                         }
00773                         if (i != mask->dimension[other_dim].extent) {
00774                                 i++;
00775                                 indx = i * mask_stride[other_dim];
00776                         }
00777                 }
00778 
00779         /* Handle a rank-three through rank-seven mask array    */
00780         } else {
00781 
00782                 /* Initialize data      */
00783                 if (result->n_dim != 0)
00784 #ifdef _UNICOS
00785 #pragma _CRI     shortloop
00786 #endif
00787                         for (i = 0; i < result->n_dim; i++) {
00788                                 result_offset[i] = 0;
00789 #ifdef _F_LOG4
00790                                 result_stride[i] =
00791                                   (result->dimension[i].stride_mult) >> rshftct;
00792 #else
00793                                 result_stride[i] =
00794                                   result->dimension[i].stride_mult;
00795 #endif
00796                         }
00797 
00798                 /* Initialize mask parameters based on which dimension
00799                  * has been requested
00800                  */
00801 
00802                 if (c_dim == 0)
00803                         i = 0;
00804                 else
00805 #ifdef _UNICOS
00806 #pragma _CRI     shortloop
00807 #endif
00808                    for (i = 0; i < c_dim; i++) {
00809                         current_place[i] = 0;
00810                         mask_offset[i] = 0;
00811                         mask_extent[i] = mask->dimension[i].extent;
00812 #ifdef _F_LOG4
00813                         mask_stride[i] =
00814                                 (mask->dimension[i].stride_mult) >> mshftct;
00815 #else
00816                         mask_stride[i] = mask->dimension[i].stride_mult;
00817 #endif
00818                    }
00819                 if (i < (mask->n_dim - 1))
00820 #ifdef _UNICOS
00821 #pragma _CRI     shortloop
00822 #endif
00823                    for ( ; i < mask->n_dim - 1; i++) {
00824                         current_place[i] = 0;
00825                         mask_offset[i] = 0;
00826                         mask_extent[i] = mask->dimension[i+1].extent;
00827 #ifdef _F_LOG4
00828                         mask_stride[i] =
00829                                 (mask->dimension[i+1].stride_mult) >> mshftct;
00830 #else
00831                         mask_stride[i] = mask->dimension[i+1].stride_mult;
00832 #endif
00833                    }
00834 #ifdef _F_LOG4
00835                 cdim_mask_stride = mask->dimension[c_dim].stride_mult >> mshftct;
00836 #else
00837                 cdim_mask_stride = mask->dimension[c_dim].stride_mult;
00838 #endif
00839 
00840                 /* Scan array until a FALSE element is found */
00841                 done = FALSE;
00842                 while (!done) {
00843 
00844                         /* Determine starting point */
00845                         indx = 0;
00846 #ifdef _UNICOS
00847 #pragma _CRI     shortloop
00848 #endif
00849                         for (i = 0; i < mask->n_dim - 1; i++)
00850                                 indx += mask_offset[i];
00851                         j = 0;
00852                         jndx = indx;
00853 
00854                         /* Scan elements */
00855                         switch (mask->type_lens.int_len) {
00856                             case 64 :
00857                                 while (j < mask->dimension[c_dim].extent) {
00858                                         if (LTOB(el_len, (i8mptr + jndx))) {
00859                                                 /* true element */
00860                                                 j++;
00861                                                 jndx = indx + j *
00862                                                   cdim_mask_stride;
00863                                         } else {
00864                                                 /* false element */
00865                                                 if (result->n_dim == 0) {
00866                                                     switch (result->type_lens.int_len) {
00867                                                     case 64 :
00868                                                         i8rptr[0] = (_f_log8) _btol(0);
00869                                                         break;
00870 #ifdef _F_LOG2
00871                                                     case 16 :
00872                                                         i2rptr[0] = (_f_log2) _btol(0);
00873                                                         break;
00874 #endif
00875 #ifdef _F_LOG1
00876                                                     case 8 :
00877                                                         i1rptr[0] = (_f_log1) _btol(0);
00878                                                         break;
00879 #endif
00880                                                     case 32 :
00881                                                     default :
00882                                                         i4rptr[0] = (_f_log4) _btol(0);
00883                                                     }
00884                                                     j = mask->dimension[c_dim].extent;
00885                                                     done = TRUE;
00886                                                 } else {
00887                                                     indx = 0;
00888                                                     for (i = 0; i < mask->n_dim - 1; i++)
00889                                                         indx += result_offset[i];
00890                                                     switch (result->type_lens.int_len) {
00891                                                     case 64 :
00892                                                         i8rptr[indx] = (_f_log8) _btol(0);
00893                                                         break;
00894 #ifdef _F_LOG2
00895                                                     case 16 :
00896                                                         i2rptr[indx] = (_f_log2) _btol(0);
00897                                                         break;
00898 #endif
00899 #ifdef _F_LOG1
00900                                                     case 8 :
00901                                                         i1rptr[indx] = (_f_log1) _btol(0);
00902                                                         break;
00903 #endif
00904                                                     case 32 :
00905                                                     default :
00906                                                         i4rptr[indx] = (_f_log4) _btol(0);
00907                                                     }
00908                                                     j = mask->dimension[c_dim].extent;
00909                                                 }
00910                                         }
00911                                 }
00912                                 break;
00913 #ifdef _F_LOG2
00914                             case 16 :
00915                                 while (j < mask->dimension[c_dim].extent) {
00916                                         if (LTOB(el_len, (i2mptr + jndx))) {
00917                                                 /* true element */
00918                                                 j++;
00919                                                 jndx = indx + j *
00920                                                   cdim_mask_stride;
00921                                         } else {
00922                                                 /* false element */
00923                                                 if (result->n_dim == 0) {
00924                                                     switch (result->type_lens.int_len) {
00925                                                     case 64 :
00926                                                         i8rptr[0] = (_f_log8) _btol(0);
00927                                                         break;
00928                                                     case 16 :
00929                                                         i2rptr[0] = (_f_log2) _btol(0);
00930                                                         break;
00931 #ifdef _F_LOG1
00932                                                     case 8 :
00933                                                         i1rptr[0] = (_f_log1) _btol(0);
00934                                                         break;
00935 #endif
00936                                                     case 32 :
00937                                                     default :
00938                                                         i4rptr[0] = (_f_log4) _btol(0);
00939                                                     }
00940                                                     j = mask->dimension[c_dim].extent;
00941                                                     done = TRUE;
00942                                                 } else {
00943                                                     indx = 0;
00944                                                     for (i = 0; i < mask->n_dim - 1; i++)
00945                                                         indx += result_offset[i];
00946                                                     switch (result->type_lens.int_len) {
00947                                                     case 64 :
00948                                                         i8rptr[indx] = (_f_log8) _btol(0);
00949                                                         break;
00950                                                     case 16 :
00951                                                         i2rptr[indx] = (_f_log2) _btol(0);
00952                                                         break;
00953 #ifdef _F_LOG1
00954                                                     case 8 :
00955                                                         i1rptr[indx] = (_f_log1) _btol(0);
00956                                                         break;
00957 #endif
00958                                                     case 32 :
00959                                                     default :
00960                                                         i4rptr[indx] = (_f_log4) _btol(0);
00961                                                     }
00962                                                     j = mask->dimension[c_dim].extent;
00963                                                 }
00964                                         }
00965                                 }
00966                                 break;
00967 #endif
00968 #ifdef _F_LOG1
00969                             case 8 :
00970                                 while (j < mask->dimension[c_dim].extent) {
00971                                         if (LTOB(el_len, (i1mptr + jndx))) {
00972                                                 /* true element */
00973                                                 j++;
00974                                                 jndx = indx + j *
00975                                                   cdim_mask_stride;
00976                                         } else {
00977                                                 /* false element */
00978                                                 if (result->n_dim == 0) {
00979                                                     switch (result->type_lens.int_len) {
00980                                                     case 64 :
00981                                                         i8rptr[0] = (_f_log8) _btol(0);
00982                                                         break;
00983                                                     case 16 :
00984                                                         i2rptr[0] = (_f_log2) _btol(0);
00985                                                         break;
00986                                                     case 8 :
00987                                                         i1rptr[0] = (_f_log1) _btol(0);
00988                                                         break;
00989                                                     case 32 :
00990                                                     default :
00991                                                         i4rptr[0] = (_f_log4) _btol(0);
00992                                                     }
00993                                                     j = mask->dimension[c_dim].extent;
00994                                                     done = TRUE;
00995                                                 } else {
00996                                                     indx = 0;
00997                                                     for (i = 0; i < mask->n_dim - 1; i++)
00998                                                         indx += result_offset[i];
00999                                                     switch (result->type_lens.int_len) {
01000                                                     case 64 :
01001                                                         i8rptr[indx] = (_f_log8) _btol(0);
01002                                                         break;
01003                                                     case 16 :
01004                                                         i2rptr[indx] = (_f_log2) _btol(0);
01005                                                         break;
01006                                                     case 8 :
01007                                                         i1rptr[indx] = (_f_log1) _btol(0);
01008                                                         break;
01009                                                     case 32 :
01010                                                     default :
01011                                                         i4rptr[indx] = (_f_log4) _btol(0);
01012                                                     }
01013                                                     j = mask->dimension[c_dim].extent;
01014                                                 }
01015                                         }
01016                                 }
01017                                 break;
01018 #endif
01019                             case 32 :
01020                             default :
01021                                 while (j < mask->dimension[c_dim].extent) {
01022                                         if (LTOB(el_len, (i4mptr + jndx))) {
01023                                                 /* true element */
01024                                                 j++;
01025                                                 jndx = indx + j *
01026                                                   cdim_mask_stride;
01027                                         } else {
01028                                                 /* false element */
01029                                                 if (result->n_dim == 0) {
01030                                                     switch (result->type_lens.int_len) {
01031                                                     case 64 :
01032                                                         i8rptr[0] = (_f_log8) _btol(0);
01033                                                         break;
01034 #ifdef _F_LOG2
01035                                                     case 16 :
01036                                                         i2rptr[0] = (_f_log2) _btol(0);
01037                                                         break;
01038 #endif
01039 #ifdef _F_LOG1
01040                                                     case 8 :
01041                                                         i1rptr[0] = (_f_log1) _btol(0);
01042                                                         break;
01043 #endif
01044                                                     case 32 :
01045                                                     default :
01046                                                         i4rptr[0] = (_f_log4) _btol(0);
01047                                                     }
01048                                                     j = mask->dimension[c_dim].extent;
01049                                                     done = TRUE;
01050                                                 } else {
01051                                                     indx = 0;
01052 #ifdef _UNICOS
01053 #pragma _CRI     shortloop
01054 #endif
01055                                                     for (i = 0; i < mask->n_dim - 1; i++)
01056                                                         indx += result_offset[i];
01057                                                     switch (result->type_lens.int_len) {
01058                                                     case 64 :
01059                                                         i8rptr[indx] = (_f_log8)_btol(0);
01060                                                         break;
01061 #ifdef _F_LOG2
01062                                                     case 16 :
01063                                                         i2rptr[indx] = (_f_log2)_btol(0);
01064                                                         break;
01065 #endif
01066 #ifdef _F_LOG1
01067                                                     case 8 :
01068                                                         i1rptr[indx] = (_f_log1)_btol(0);
01069                                                         break;
01070 #endif
01071                                                     case 32 :
01072                                                     default :
01073                                                         i4rptr[indx] = (_f_log4)_btol(0);
01074                                                     }
01075                                                     j = mask->dimension[c_dim].extent;
01076                                                 }
01077                                         }
01078                                 }
01079                         }
01080         
01081                         /* If not done, add to pointer for each dimension */
01082                         if (!done) {
01083                                 i = 0;
01084                                 stop = FALSE;
01085                                 while (stop == FALSE && i < mask->n_dim - 1) {
01086                                         if (current_place[i] == mask_extent[i] - 1) {
01087                                                 current_place[i] = 0;
01088                                                 mask_offset[i] = 0;
01089                                                 if (result->n_dim != 0)
01090                                                         result_offset[i] = 0;
01091                                         } else {
01092                                                 current_place[i]++;
01093                                                 mask_offset[i] =
01094                                                   current_place[i] *
01095                                                     mask_stride[i];
01096                                                 if (result->n_dim != 0)
01097                                                         result_offset[i] =
01098                                                           current_place[i] *
01099                                                             result_stride[i];
01100                                                 stop = TRUE;
01101                                         }
01102                                         i++;
01103                                 }
01104                                 if (stop == FALSE)
01105 
01106                                         /* Processed the whole array,
01107                                          * quit processing
01108                                          */
01109                                         done = TRUE;
01110                         }
01111                 }
01112         }
01113 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines