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 static const char USMID[] = "@(#) libfi/array/maxval.c 92.0 10/08/98 14:37:14"; 00038 00039 #include <stddef.h> 00040 #include <liberrno.h> 00041 #include <fmath.h> 00042 #include <cray/dopevec.h> 00043 #include <cray/portdefs.h> 00044 #include "arraydefs.h" 00045 00046 #define USE_INT8 1 00047 #define USE_INT6 2 00048 #define USE_INT4 3 00049 #define USE_INT2 4 00050 #define USE_INT1 5 00051 #define USE_REAL16 6 00052 #define USE_REAL8 7 00053 #define USE_REAL4 8 00054 00055 /* 00056 * INCREMENT calculates the offset for each dimension of the source, 00057 * mask and result arrays. The sum of the offsets gives the number 00058 * of elements from the beginning of the array. 00059 */ 00060 00061 #define INCREMENT() \ 00062 curdim[0]++; \ 00063 if (curdim[0] < src_ext[0]) { \ 00064 src_off[0] = curdim[0] * src_strd[0]; \ 00065 msk_off[0] = curdim[0] * msk_strd[0]; \ 00066 res_off[0] = curdim[0] * res_strd[0]; \ 00067 } else { \ 00068 curdim[0] = 0; \ 00069 src_off[0] = 0; \ 00070 msk_off[0] = 0; \ 00071 res_off[0] = 0; \ 00072 curdim[1]++; \ 00073 if (curdim[1] < src_ext[1]) { \ 00074 src_off[1] = curdim[1] * src_strd[1]; \ 00075 msk_off[1] = curdim[1] * msk_strd[1]; \ 00076 res_off[1] = curdim[1] * res_strd[1]; \ 00077 } else { \ 00078 curdim[1] = 0; \ 00079 src_off[1] = 0; \ 00080 msk_off[1] = 0; \ 00081 res_off[1] = 0; \ 00082 curdim[2]++; \ 00083 if (curdim[2] < src_ext[2]) { \ 00084 src_off[2] = curdim[2] * src_strd[2]; \ 00085 msk_off[2] = curdim[2] * msk_strd[2]; \ 00086 res_off[2] = curdim[2] * res_strd[2]; \ 00087 } else { \ 00088 curdim[2] = 0; \ 00089 src_off[2] = 0; \ 00090 msk_off[2] = 0; \ 00091 res_off[2] = 0; \ 00092 curdim[3]++; \ 00093 if (curdim[3] < src_ext[3]) { \ 00094 src_off[3] = curdim[3] * src_strd[3]; \ 00095 msk_off[3] = curdim[3] * msk_strd[3]; \ 00096 res_off[3] = curdim[3] * res_strd[3]; \ 00097 } else { \ 00098 curdim[3] = 0; \ 00099 src_off[3] = 0; \ 00100 msk_off[3] = 0; \ 00101 res_off[3] = 0; \ 00102 curdim[4]++; \ 00103 if (curdim[4] < src_ext[4]) { \ 00104 src_off[4] = curdim[4] * src_strd[4]; \ 00105 msk_off[4] = curdim[4] * msk_strd[4]; \ 00106 res_off[4] = curdim[4] * res_strd[4]; \ 00107 } else { \ 00108 curdim[4] = 0; \ 00109 src_off[4] = 0; \ 00110 msk_off[4] = 0; \ 00111 res_off[4] = 0; \ 00112 curdim[5]++; \ 00113 src_off[5] = curdim[5] * src_strd[5]; \ 00114 msk_off[5] = curdim[5] * msk_strd[5]; \ 00115 res_off[5] = curdim[5] * res_strd[5]; \ 00116 } \ 00117 } \ 00118 } \ 00119 } \ 00120 } 00121 00122 /* INCR_RES calculates the offset for the result array */ 00123 00124 #define INCR_RES() \ 00125 curdim[0]++; \ 00126 if (curdim[0] < res_ext[0]) { \ 00127 res_off[0] = curdim[0] * res_strd[0]; \ 00128 } else { \ 00129 curdim[0] = 0; \ 00130 res_off[0] = 0; \ 00131 curdim[1]++; \ 00132 if (curdim[1] < res_ext[1]) { \ 00133 res_off[1] = curdim[1] * res_strd[1]; \ 00134 } else { \ 00135 curdim[1] = 0; \ 00136 res_off[1] = 0; \ 00137 curdim[2]++; \ 00138 if (curdim[2] < res_ext[2]) { \ 00139 res_off[2] = curdim[2] * res_strd[2]; \ 00140 } else { \ 00141 curdim[2] = 0; \ 00142 res_off[2] = 0; \ 00143 curdim[3]++; \ 00144 if (curdim[3] < res_ext[3]) { \ 00145 res_off[3] = curdim[3] * res_strd[3]; \ 00146 } else { \ 00147 curdim[3] = 0; \ 00148 res_off[3] = 0; \ 00149 curdim[4]++; \ 00150 if (curdim[4] < res_ext[4]) { \ 00151 res_off[4] = curdim[4] * res_strd[4]; \ 00152 } else { \ 00153 curdim[4] = 0; \ 00154 res_off[4] = 0; \ 00155 curdim[5]++; \ 00156 res_off[5] = curdim[5] * res_strd[5]; \ 00157 } \ 00158 } \ 00159 } \ 00160 } \ 00161 } \ 00162 if (rank == 2) \ 00163 rindx = res_off[0]; \ 00164 else if (rank == 3) \ 00165 rindx = res_off[0] + res_off[1]; \ 00166 else if (rank == 4) \ 00167 rindx = res_off[0] + res_off[1] + res_off[2]; \ 00168 else if (rank == 5) \ 00169 rindx = res_off[0] + res_off[1] + \ 00170 res_off[2] + res_off[3]; \ 00171 else if (rank == 6) \ 00172 rindx = res_off[0] + res_off[1] + res_off[2] + \ 00173 res_off[3] + res_off[4]; \ 00174 else \ 00175 rindx = res_off[0] + res_off[1] + res_off[2] + \ 00176 res_off[3] + res_off[4] + res_off[5]; 00177 00178 /* LOAD_DM_MK correctly for P.E. 3.0 and above */ 00179 00180 #define LOAD_DM_MK() \ 00181 dm = dimp; \ 00182 mk = mask; \ 00183 /* if last arg = NULL, is last-1 arg mask or dim? */ \ 00184 if (mask == NULL) { \ 00185 /* last arg = NULL, is last-1 arg mask or dim? */ \ 00186 if (dimp != NULL) { \ 00187 if (dimp->type_lens.type == DVTYPE_LOGICAL) { \ 00188 /* last-1 argument is mask. */ \ 00189 mk = dimp; \ 00190 dm = mask; \ 00191 } \ 00192 } \ 00193 } \ 00194 if (dm != NULL) { \ 00195 _f_int dmintlen; \ 00196 dmintlen = dm->type_lens.int_len >> 3; \ 00197 dimenp = (_f_int *) &dimenlc; \ 00198 if (dmintlen == sizeof(_f_int8)) { \ 00199 *dimenp = *(_f_int8 *) dm->base_addr.a.ptr; \ 00200 } else if (dmintlen == sizeof(_f_int4)) { \ 00201 *dimenp = *(_f_int4 *) dm->base_addr.a.ptr; \ 00202 } else if (dmintlen == sizeof(_f_int2)) { \ 00203 *dimenp = *(_f_int2 *) dm->base_addr.a.ptr; \ 00204 } else if (dmintlen == sizeof(_f_int1)) { \ 00205 *dimenp = *(_f_int1 *) dm->base_addr.a.ptr; \ 00206 } \ 00207 } 00208 00209 00210 /* 00211 * MAXVAL has six entry points. There is an entry point for a dope 00212 * vector return, and a scalar return for integer, real and double 00213 * precision. 00214 */ 00215 00216 /* P.E. 2.0 and earlier entry points for MAXVAL contain only a single 00217 * underbar after MAXVAL and before the TYPE letter. Only these entry 00218 * points may specify DVSUBTYPE_INT46 and INTEGER(KIND=6). P.E. 3.0 00219 * does not have INTEGER(KIND=6). 00220 * 00221 * P.E. 3.0 uses the double underbar between MAXVAL and the TYPE letter. 00222 * Note that we can never do a fast compare the way in which the routine 00223 * is written because it starts with with -HUGE as the first maxinum 00224 * value it is comparing against to find the maximum location. 00225 */ 00226 00227 #ifdef _UNICOS 00228 #pragma _CRI duplicate _MAXVAL_J as MAXVAL_J@ 00229 #endif 00230 void 00231 _MAXVAL_J ( DopeVectorType * result, 00232 DopeVectorType * source, 00233 _f_int * dimp, 00234 DopeVectorType * mask) 00235 { 00236 void __maxval(); 00237 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT64, 00238 USE_INT8); 00239 } 00240 00241 void 00242 _MAXVAL__J ( DopeVectorType * result, 00243 DopeVectorType * source, 00244 DopeVectorType * dimp, 00245 DopeVectorType * mask) 00246 { 00247 void __maxval(); 00248 DopeVectorType *dm, *mk; 00249 _f_int *dimenp = NULL; 00250 _f_int dimenlc = 0; 00251 LOAD_DM_MK(); 00252 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT64, 00253 USE_INT8); 00254 } 00255 00256 00257 #ifdef _UNICOS 00258 #pragma _CRI duplicate _MAXVAL_S as MAXVAL_S@ 00259 #endif 00260 void 00261 _MAXVAL_S ( DopeVectorType * result, 00262 DopeVectorType * source, 00263 _f_int * dimp, 00264 DopeVectorType * mask) 00265 { 00266 void __maxval(); 00267 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_REAL64, 00268 USE_REAL8); 00269 } 00270 00271 void 00272 _MAXVAL__S ( DopeVectorType * result, 00273 DopeVectorType * source, 00274 DopeVectorType * dimp, 00275 DopeVectorType * mask) 00276 { 00277 void __maxval(); 00278 DopeVectorType *dm, *mk; 00279 _f_int *dimenp = NULL; 00280 _f_int dimenlc = 0; 00281 LOAD_DM_MK(); 00282 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_REAL64, 00283 USE_REAL8); 00284 } 00285 00286 #if defined _F_REAL16 && _F_REAL16 != (-1) 00287 #ifdef _UNICOS 00288 #pragma _CRI duplicate _MAXVAL_D as MAXVAL_D@ 00289 #endif 00290 void 00291 _MAXVAL_D ( DopeVectorType * result, 00292 DopeVectorType * source, 00293 _f_int * dimp, 00294 DopeVectorType * mask) 00295 { 00296 void __maxval(); 00297 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_REAL128, 00298 USE_REAL16); 00299 } 00300 00301 void 00302 _MAXVAL__D ( DopeVectorType * result, 00303 DopeVectorType * source, 00304 DopeVectorType * dimp, 00305 DopeVectorType * mask) 00306 { 00307 void __maxval(); 00308 DopeVectorType *dm, *mk; 00309 _f_int *dimenp = NULL; 00310 _f_int dimenlc = 0; 00311 LOAD_DM_MK(); 00312 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_REAL128, 00313 USE_REAL16); 00314 } 00315 #endif 00316 00317 #ifdef _UNICOS 00318 #pragma _CRI duplicate _MAXVAL_I as MAXVAL_I@ 00319 #endif 00320 void 00321 _MAXVAL_I ( DopeVectorType * result, 00322 DopeVectorType * source, 00323 _f_int * dimp, 00324 DopeVectorType * mask) 00325 { 00326 void __maxval(); 00327 #ifdef _F_INT6 00328 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT46, 00329 USE_INT6); 00330 #else 00331 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT64, 00332 USE_INT8); 00333 #endif 00334 } 00335 00336 void 00337 _MAXVAL__I ( DopeVectorType * result, 00338 DopeVectorType * source, 00339 DopeVectorType * dimp, 00340 DopeVectorType * mask) 00341 { 00342 void __maxval(); 00343 DopeVectorType *dm, *mk; 00344 _f_int *dimenp = NULL; 00345 _f_int dimenlc = 0; 00346 LOAD_DM_MK(); 00347 #ifdef _F_INT6 00348 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT46, 00349 USE_INT6); 00350 #else 00351 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT64, 00352 USE_INT8); 00353 #endif 00354 } 00355 00356 #ifndef _F_INT6 00357 #ifdef __mips 00358 typedef _f_int8 _f_int6; /* integer of default kind */ 00359 #else 00360 typedef int _f_int6; /* integer of default kind */ 00361 #endif /* __mips */ 00362 #endif /* Not _F_INT6 */ 00363 00364 #ifdef _UNICOS 00365 #pragma _CRI duplicate _MAXVAL0_I as MAXVAL0_I@ 00366 #endif 00367 _f_int6 00368 _MAXVAL0_I ( DopeVectorType * source, 00369 _f_int * dimp, 00370 DopeVectorType * mask) 00371 { 00372 void __maxval(); 00373 int i = 1; 00374 _f_int6 i6; 00375 DopeVectorType result, *res_ptr; 00376 00377 i6 = (_f_int6) -HUGE_INT6_F90; 00378 res_ptr = (DopeVectorType *) &result; 00379 res_ptr->assoc = 1; 00380 res_ptr->base_addr.a.ptr = (_f_int6 *) &i6; 00381 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00382 res_ptr->ptr_alloc = 0; 00383 res_ptr->p_or_a = NOT_P_OR_A; 00384 res_ptr->n_dim = 0; 00385 res_ptr->type_lens.type = DVTYPE_INTEGER; 00386 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00387 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00388 res_ptr->type_lens.int_len = source->type_lens.int_len; 00389 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00390 res_ptr->orig_base = (_f_int6 *) NULL; 00391 res_ptr->orig_size = 0; 00392 #ifdef _F_INT6 00393 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT46, 00394 USE_INT6); 00395 #else 00396 (void) __maxval (res_ptr, source, dimp, mask, 0, DVSUBTYPE_INT64, 00397 USE_INT8); 00398 #endif 00399 return (*(_f_int6 *) res_ptr->base_addr.a.ptr); 00400 } 00401 00402 _f_int8 00403 _MAXVAL0__I ( DopeVectorType * source, 00404 DopeVectorType * dimp, 00405 DopeVectorType * mask) 00406 { 00407 void __maxval(); 00408 int i = 1; 00409 _f_int6 i6; 00410 DopeVectorType result, *res_ptr; 00411 DopeVectorType *dm, *mk; 00412 _f_int *dimenp = NULL; 00413 _f_int dimenlc = 0; 00414 00415 LOAD_DM_MK(); 00416 i6 = (_f_int6) -HUGE_INT6_F90; 00417 res_ptr = (DopeVectorType *) &result; 00418 res_ptr->assoc = 1; 00419 res_ptr->base_addr.a.ptr = (_f_int6 *) &i6; 00420 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00421 res_ptr->ptr_alloc = 0; 00422 res_ptr->p_or_a = NOT_P_OR_A; 00423 res_ptr->n_dim = 0; 00424 res_ptr->type_lens.type = DVTYPE_INTEGER; 00425 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00426 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00427 res_ptr->type_lens.int_len = source->type_lens.int_len; 00428 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00429 res_ptr->orig_base = (_f_int6 *) NULL; 00430 res_ptr->orig_size = 0; 00431 #ifdef _F_INT6 00432 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT46, 00433 USE_INT6); 00434 #else 00435 (void) __maxval (res_ptr, source, dimenp, mk, 0, DVSUBTYPE_INT64, 00436 USE_INT8); 00437 #endif 00438 return (*(_f_int6 *) res_ptr->base_addr.a.ptr); 00439 } 00440 00441 #ifdef _UNICOS 00442 #pragma _CRI duplicate _MAXVAL_I4 as MAXVAL_I4@ 00443 #endif 00444 void 00445 _MAXVAL_I4 ( DopeVectorType * result, 00446 DopeVectorType * source, 00447 _f_int * dimp, 00448 DopeVectorType * mask) 00449 { 00450 void __maxval(); 00451 #ifndef _F_INT4 00452 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT46, 00453 USE_INT4); 00454 #else 00455 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT32, 00456 USE_INT4); 00457 #endif 00458 } 00459 00460 void 00461 _MAXVAL__I4 ( DopeVectorType * result, 00462 DopeVectorType * source, 00463 DopeVectorType * dimp, 00464 DopeVectorType * mask) 00465 { 00466 void __maxval(); 00467 DopeVectorType *dm, *mk; 00468 _f_int *dimenp = NULL; 00469 _f_int dimenlc = 0; 00470 LOAD_DM_MK(); 00471 #ifndef _F_INT4 00472 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT46, 00473 USE_INT4); 00474 #else 00475 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT32, 00476 USE_INT4); 00477 #endif 00478 } 00479 00480 #ifdef _UNICOS 00481 #pragma _CRI duplicate _MAXVAL_I2 as MAXVAL_I2@ 00482 #endif 00483 void 00484 _MAXVAL_I2 ( DopeVectorType * result, 00485 DopeVectorType * source, 00486 _f_int * dimp, 00487 DopeVectorType * mask) 00488 { 00489 void __maxval(); 00490 #ifndef _F_INT4 00491 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT46, 00492 USE_INT2); 00493 #else 00494 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT32, 00495 USE_INT2); 00496 #endif 00497 } 00498 00499 void 00500 _MAXVAL__I2 ( DopeVectorType * result, 00501 DopeVectorType * source, 00502 DopeVectorType * dimp, 00503 DopeVectorType * mask) 00504 { 00505 void __maxval(); 00506 DopeVectorType *dm, *mk; 00507 _f_int *dimenp = NULL; 00508 _f_int dimenlc = 0; 00509 LOAD_DM_MK(); 00510 #ifndef _F_INT4 00511 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT46, 00512 USE_INT2); 00513 #else 00514 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT32, 00515 USE_INT2); 00516 #endif 00517 } 00518 00519 #ifdef _UNICOS 00520 #pragma _CRI duplicate _MAXVAL_I1 as MAXVAL_I1@ 00521 #endif 00522 void 00523 _MAXVAL_I1 ( DopeVectorType * result, 00524 DopeVectorType * source, 00525 _f_int * dimp, 00526 DopeVectorType * mask) 00527 { 00528 void __maxval(); 00529 #ifndef _F_INT4 00530 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT46, 00531 USE_INT1); 00532 #else 00533 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_INT32, 00534 USE_INT1); 00535 #endif 00536 } 00537 00538 void 00539 _MAXVAL__I1 ( DopeVectorType * result, 00540 DopeVectorType * source, 00541 DopeVectorType * dimp, 00542 DopeVectorType * mask) 00543 { 00544 void __maxval(); 00545 DopeVectorType *dm, *mk; 00546 _f_int *dimenp = NULL; 00547 _f_int dimenlc = 0; 00548 LOAD_DM_MK(); 00549 #ifndef _F_INT4 00550 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT46, 00551 USE_INT1); 00552 #else 00553 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_INT32, 00554 USE_INT1); 00555 #endif 00556 } 00557 00558 #ifdef _UNICOS 00559 #pragma _CRI duplicate _MAXVAL0_I4 as MAXVAL0_I4@ 00560 #endif 00561 _f_int4 00562 _MAXVAL0_I4 ( DopeVectorType * source, 00563 _f_int * dimp, 00564 DopeVectorType * mask) 00565 { 00566 void __maxval(); 00567 int i = 1; 00568 _f_int4 i4; 00569 DopeVectorType result, *res_ptr; 00570 00571 i4 = (_f_int4) -HUGE_INT4_F90; 00572 res_ptr = (DopeVectorType *) &result; 00573 res_ptr->assoc = 1; 00574 res_ptr->base_addr.a.ptr = (_f_int4 *) &i4; 00575 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00576 res_ptr->ptr_alloc = 0; 00577 res_ptr->p_or_a = NOT_P_OR_A; 00578 res_ptr->n_dim = 0; 00579 res_ptr->type_lens.type = DVTYPE_INTEGER; 00580 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00581 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00582 res_ptr->type_lens.int_len = source->type_lens.int_len; 00583 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00584 res_ptr->orig_base = (_f_int4 *) NULL; 00585 res_ptr->orig_size = 0; 00586 #ifndef _F_INT4 00587 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT46, 00588 USE_INT4); 00589 #else 00590 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT32, 00591 USE_INT4); 00592 #endif 00593 return (*(_f_int4 *) res_ptr->base_addr.a.ptr); 00594 } 00595 00596 _f_int4 00597 _MAXVAL0__I4 ( DopeVectorType * source, 00598 DopeVectorType * dimp, 00599 DopeVectorType * mask) 00600 { 00601 void __maxval(); 00602 int i = 1; 00603 _f_int4 i4; 00604 DopeVectorType result, *res_ptr; 00605 DopeVectorType *dm, *mk; 00606 _f_int *dimenp = NULL; 00607 _f_int dimenlc = 0; 00608 00609 LOAD_DM_MK(); 00610 i4 = (_f_int4) -HUGE_INT4_F90; 00611 res_ptr = (DopeVectorType *) &result; 00612 res_ptr->assoc = 1; 00613 res_ptr->base_addr.a.ptr = (_f_int4 *) &i4; 00614 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00615 res_ptr->ptr_alloc = 0; 00616 res_ptr->p_or_a = NOT_P_OR_A; 00617 res_ptr->n_dim = 0; 00618 res_ptr->type_lens.type = DVTYPE_INTEGER; 00619 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00620 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00621 res_ptr->type_lens.int_len = source->type_lens.int_len; 00622 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00623 res_ptr->orig_base = (_f_int4 *) NULL; 00624 res_ptr->orig_size = 0; 00625 #ifndef _F_INT4 00626 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT46, 00627 USE_INT4); 00628 #else 00629 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT32, 00630 USE_INT4); 00631 #endif 00632 return (*(_f_int4 *) res_ptr->base_addr.a.ptr); 00633 } 00634 00635 #ifdef _UNICOS 00636 #pragma _CRI duplicate _MAXVAL0_I2 as MAXVAL0_I2@ 00637 #endif 00638 _f_int2 00639 _MAXVAL0_I2 ( DopeVectorType * source, 00640 _f_int * dimp, 00641 DopeVectorType * mask) 00642 { 00643 void __maxval(); 00644 int i = 1; 00645 _f_int2 i2; 00646 DopeVectorType result, *res_ptr; 00647 00648 i2 = (_f_int2) -HUGE_INT2_F90; 00649 res_ptr = (DopeVectorType *) &result; 00650 res_ptr->assoc = 1; 00651 res_ptr->base_addr.a.ptr = (_f_int2 *) &i2; 00652 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00653 res_ptr->ptr_alloc = 0; 00654 res_ptr->p_or_a = NOT_P_OR_A; 00655 res_ptr->n_dim = 0; 00656 res_ptr->type_lens.type = DVTYPE_INTEGER; 00657 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00658 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00659 res_ptr->type_lens.int_len = source->type_lens.int_len; 00660 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00661 res_ptr->orig_base = (_f_int2 *) NULL; 00662 res_ptr->orig_size = 0; 00663 #ifndef _F_INT4 00664 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT46, 00665 USE_INT2); 00666 #else 00667 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT32, 00668 USE_INT2); 00669 #endif 00670 return (*(_f_int2 *) res_ptr->base_addr.a.ptr); 00671 } 00672 00673 _f_int2 00674 _MAXVAL0__I2 ( DopeVectorType * source, 00675 DopeVectorType * dimp, 00676 DopeVectorType * mask) 00677 { 00678 void __maxval(); 00679 int i = 1; 00680 _f_int2 i2; 00681 DopeVectorType result, *res_ptr; 00682 DopeVectorType *dm, *mk; 00683 _f_int *dimenp = NULL; 00684 _f_int dimenlc = 0; 00685 00686 LOAD_DM_MK(); 00687 i2 = (_f_int2) -HUGE_INT2_F90; 00688 res_ptr = (DopeVectorType *) &result; 00689 res_ptr->assoc = 1; 00690 res_ptr->base_addr.a.ptr = (_f_int2 *) &i2; 00691 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00692 res_ptr->ptr_alloc = 0; 00693 res_ptr->p_or_a = NOT_P_OR_A; 00694 res_ptr->n_dim = 0; 00695 res_ptr->type_lens.type = DVTYPE_INTEGER; 00696 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00697 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00698 res_ptr->type_lens.int_len = source->type_lens.int_len; 00699 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00700 res_ptr->orig_base = (_f_int2 *) NULL; 00701 res_ptr->orig_size = 0; 00702 #ifndef _F_INT4 00703 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT46, 00704 USE_INT2); 00705 #else 00706 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT32, 00707 USE_INT2); 00708 #endif 00709 return (*(_f_int2 *) res_ptr->base_addr.a.ptr); 00710 } 00711 00712 #ifdef _UNICOS 00713 #pragma _CRI duplicate _MAXVAL0_I1 as MAXVAL0_I1@ 00714 #endif 00715 _f_int1 00716 _MAXVAL0_I1 ( DopeVectorType * source, 00717 _f_int * dimp, 00718 DopeVectorType * mask) 00719 { 00720 void __maxval(); 00721 int i = 1; 00722 _f_int1 i1; 00723 DopeVectorType result, *res_ptr; 00724 00725 i1 = (_f_int1) -HUGE_INT1_F90; 00726 res_ptr = (DopeVectorType *) &result; 00727 res_ptr->assoc = 1; 00728 res_ptr->base_addr.a.ptr = (_f_int1 *) &i1; 00729 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00730 res_ptr->ptr_alloc = 0; 00731 res_ptr->p_or_a = NOT_P_OR_A; 00732 res_ptr->n_dim = 0; 00733 res_ptr->type_lens.type = DVTYPE_INTEGER; 00734 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00735 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00736 res_ptr->type_lens.int_len = source->type_lens.int_len; 00737 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00738 res_ptr->orig_base = (_f_int1 *) NULL; 00739 res_ptr->orig_size = 0; 00740 #ifndef _F_INT4 00741 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT46, 00742 USE_INT1); 00743 #else 00744 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT32, 00745 USE_INT1); 00746 #endif 00747 return (*(_f_int1 *) res_ptr->base_addr.a.ptr); 00748 } 00749 00750 _f_int1 00751 _MAXVAL0__I1 ( DopeVectorType * source, 00752 DopeVectorType * dimp, 00753 DopeVectorType * mask) 00754 { 00755 void __maxval(); 00756 int i = 1; 00757 _f_int1 i1; 00758 DopeVectorType result, *res_ptr; 00759 DopeVectorType *dm, *mk; 00760 _f_int *dimenp = NULL; 00761 _f_int dimenlc = 0; 00762 00763 LOAD_DM_MK(); 00764 i1 = (_f_int1) -HUGE_INT1_F90; 00765 res_ptr = (DopeVectorType *) &result; 00766 res_ptr->assoc = 1; 00767 res_ptr->base_addr.a.ptr = (_f_int1 *) &i1; 00768 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00769 res_ptr->ptr_alloc = 0; 00770 res_ptr->p_or_a = NOT_P_OR_A; 00771 res_ptr->n_dim = 0; 00772 res_ptr->type_lens.type = DVTYPE_INTEGER; 00773 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00774 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00775 res_ptr->type_lens.int_len = source->type_lens.int_len; 00776 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00777 res_ptr->orig_base = (_f_int1 *) NULL; 00778 res_ptr->orig_size = 0; 00779 #ifndef _F_INT4 00780 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT46, 00781 USE_INT1); 00782 #else 00783 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT32, 00784 USE_INT1); 00785 #endif 00786 return (*(_f_int1 *) res_ptr->base_addr.a.ptr); 00787 } 00788 00789 #ifdef _UNICOS 00790 #pragma _CRI duplicate _MAXVAL_S4 as MAXVAL_S4@ 00791 #endif 00792 void 00793 _MAXVAL_S4 ( DopeVectorType * result, 00794 DopeVectorType * source, 00795 _f_int * dimp, 00796 DopeVectorType * mask) 00797 { 00798 void __maxval(); 00799 #ifndef _F_REAL4 00800 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_REAL64, 00801 USE_REAL4); 00802 #else 00803 (void) __maxval (result, source, dimp, mask, 0, DVSUBTYPE_REAL32, 00804 USE_REAL4); 00805 #endif 00806 } 00807 00808 void 00809 _MAXVAL__S4 ( DopeVectorType * result, 00810 DopeVectorType * source, 00811 DopeVectorType * dimp, 00812 DopeVectorType * mask) 00813 { 00814 void __maxval(); 00815 DopeVectorType *dm, *mk; 00816 _f_int *dimenp = NULL; 00817 _f_int dimenlc = 0; 00818 LOAD_DM_MK(); 00819 #ifndef _F_REAL4 00820 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_REAL64, 00821 USE_REAL4); 00822 #else 00823 (void) __maxval (result, source, dimenp, mk, 0, DVSUBTYPE_REAL32, 00824 USE_REAL4); 00825 #endif 00826 } 00827 00828 #ifdef _UNICOS 00829 #pragma _CRI duplicate _MAXVAL0_S4 as MAXVAL0_S4@ 00830 #endif 00831 _f_real4 00832 _MAXVAL0_S4 ( DopeVectorType * source, 00833 _f_int * dimp, 00834 DopeVectorType * mask) 00835 { 00836 void __maxval(); 00837 int i = 1; 00838 _f_real4 s4; 00839 DopeVectorType result, *res_ptr; 00840 00841 s4 = (_f_real4) -HUGE_REAL4_F90; 00842 res_ptr = (DopeVectorType *) &result; 00843 res_ptr->assoc = 1; 00844 res_ptr->base_addr.a.ptr = (_f_real4 *) &s4; 00845 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00846 res_ptr->ptr_alloc = 0; 00847 res_ptr->p_or_a = NOT_P_OR_A; 00848 res_ptr->n_dim = 0; 00849 res_ptr->type_lens.type = DVTYPE_REAL; 00850 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00851 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00852 res_ptr->type_lens.int_len = source->type_lens.int_len; 00853 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00854 res_ptr->orig_base = (_f_real4 *) NULL; 00855 res_ptr->orig_size = 0; 00856 #ifndef _F_REAL4 00857 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_REAL64, 00858 USE_REAL4); 00859 #else 00860 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_REAL32, 00861 USE_REAL4); 00862 #endif 00863 return (*(_f_real4 *) res_ptr->base_addr.a.ptr); 00864 } 00865 00866 _f_real4 00867 _MAXVAL0__S4 ( DopeVectorType * source, 00868 DopeVectorType * dimp, 00869 DopeVectorType * mask) 00870 { 00871 void __maxval(); 00872 int i = 1; 00873 _f_real4 s4; 00874 DopeVectorType result, *res_ptr; 00875 DopeVectorType *dm, *mk; 00876 _f_int *dimenp = NULL; 00877 _f_int dimenlc = 0; 00878 00879 LOAD_DM_MK(); 00880 s4 = (_f_real4) -HUGE_REAL4_F90; 00881 res_ptr = (DopeVectorType *) &result; 00882 res_ptr->assoc = 1; 00883 res_ptr->base_addr.a.ptr = (_f_real4 *) &s4; 00884 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00885 res_ptr->ptr_alloc = 0; 00886 res_ptr->p_or_a = NOT_P_OR_A; 00887 res_ptr->n_dim = 0; 00888 res_ptr->type_lens.type = DVTYPE_REAL; 00889 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00890 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00891 res_ptr->type_lens.int_len = source->type_lens.int_len; 00892 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00893 res_ptr->orig_base = (_f_real4 *) NULL; 00894 res_ptr->orig_size = 0; 00895 #ifndef _F_REAL4 00896 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_REAL64, 00897 USE_REAL4); 00898 #else 00899 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_REAL32, 00900 USE_REAL4); 00901 #endif 00902 return (*(_f_real4 *) res_ptr->base_addr.a.ptr); 00903 } 00904 00905 #ifdef _UNICOS 00906 #pragma _CRI duplicate _MAXVAL0_J as MAXVAL0_J@ 00907 #endif 00908 _f_int8 00909 _MAXVAL0_J ( DopeVectorType * source, 00910 _f_int * dimp, 00911 DopeVectorType * mask) 00912 { 00913 void __maxval(); 00914 int i = 1; 00915 _f_int8 i8; 00916 DopeVectorType result, *res_ptr; 00917 00918 i8 = (_f_int8) -HUGE_INT8_F90; 00919 res_ptr = (DopeVectorType *) &result; 00920 res_ptr->assoc = 1; 00921 res_ptr->base_addr.a.ptr = (_f_int8 *) &i8; 00922 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00923 res_ptr->ptr_alloc = 0; 00924 res_ptr->p_or_a = NOT_P_OR_A; 00925 res_ptr->n_dim = 0; 00926 res_ptr->type_lens.type = DVTYPE_INTEGER; 00927 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00928 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00929 res_ptr->type_lens.int_len = source->type_lens.int_len; 00930 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00931 res_ptr->orig_base = (_f_int8 *) NULL; 00932 res_ptr->orig_size = 0; 00933 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_INT64, 00934 USE_INT8); 00935 return(*(_f_int8 *) res_ptr->base_addr.a.ptr); 00936 } 00937 00938 _f_int8 00939 _MAXVAL0__J ( DopeVectorType * source, 00940 DopeVectorType * dimp, 00941 DopeVectorType * mask) 00942 { 00943 void __maxval(); 00944 int i = 1; 00945 _f_int8 i8; 00946 DopeVectorType result, *res_ptr; 00947 DopeVectorType *dm, *mk; 00948 _f_int *dimenp = NULL; 00949 _f_int dimenlc = 0; 00950 00951 LOAD_DM_MK(); 00952 i8 = (_f_int8) -HUGE_INT8_F90; 00953 res_ptr = (DopeVectorType *) &result; 00954 res_ptr->assoc = 1; 00955 res_ptr->base_addr.a.ptr = (_f_int8 *) &i8; 00956 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00957 res_ptr->ptr_alloc = 0; 00958 res_ptr->p_or_a = NOT_P_OR_A; 00959 res_ptr->n_dim = 0; 00960 res_ptr->type_lens.type = DVTYPE_INTEGER; 00961 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00962 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00963 res_ptr->type_lens.int_len = source->type_lens.int_len; 00964 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00965 res_ptr->orig_base = (_f_int8 *) NULL; 00966 res_ptr->orig_size = 0; 00967 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_INT64, 00968 USE_INT8); 00969 return(*(_f_int8 *) res_ptr->base_addr.a.ptr); 00970 } 00971 00972 #ifdef _UNICOS 00973 #pragma _CRI duplicate _MAXVAL0_S as MAXVAL0_S@ 00974 #endif 00975 _f_real8 00976 _MAXVAL0_S ( DopeVectorType * source, 00977 _f_int * dimp, 00978 DopeVectorType * mask) 00979 { 00980 void __maxval(); 00981 int i = 1; 00982 _f_real8 s8; 00983 DopeVectorType result, *res_ptr; 00984 00985 s8 = (_f_real8) -HUGE_REAL8_F90; 00986 res_ptr = (DopeVectorType *) &result; 00987 res_ptr->assoc = 1; 00988 res_ptr->base_addr.a.ptr = (_f_real8 *) &s8; 00989 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 00990 res_ptr->ptr_alloc = 0; 00991 res_ptr->p_or_a = NOT_P_OR_A; 00992 res_ptr->n_dim = 0; 00993 res_ptr->type_lens.type = DVTYPE_REAL; 00994 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 00995 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 00996 res_ptr->type_lens.int_len = source->type_lens.int_len; 00997 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 00998 res_ptr->orig_base = (_f_real8 *) NULL; 00999 res_ptr->orig_size = 0; 01000 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_REAL64, 01001 USE_REAL8); 01002 return(*(_f_real8 *) res_ptr->base_addr.a.ptr); 01003 } 01004 01005 _f_real8 01006 _MAXVAL0__S ( DopeVectorType * source, 01007 DopeVectorType * dimp, 01008 DopeVectorType * mask) 01009 { 01010 void __maxval(); 01011 int i = 1; 01012 _f_real8 s8; 01013 DopeVectorType result, *res_ptr; 01014 DopeVectorType *dm, *mk; 01015 _f_int *dimenp = NULL; 01016 _f_int dimenlc = 0; 01017 01018 LOAD_DM_MK(); 01019 s8 = (_f_real8) -HUGE_REAL8_F90; 01020 res_ptr = (DopeVectorType *) &result; 01021 res_ptr->assoc = 1; 01022 res_ptr->base_addr.a.ptr = (_f_real8 *) &s8; 01023 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 01024 res_ptr->ptr_alloc = 0; 01025 res_ptr->p_or_a = NOT_P_OR_A; 01026 res_ptr->n_dim = 0; 01027 res_ptr->type_lens.type = DVTYPE_REAL; 01028 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 01029 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 01030 res_ptr->type_lens.int_len = source->type_lens.int_len; 01031 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 01032 res_ptr->orig_base = (_f_real8 *) NULL; 01033 res_ptr->orig_size = 0; 01034 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_REAL64, 01035 USE_REAL8); 01036 return(*(_f_real8 *) res_ptr->base_addr.a.ptr); 01037 } 01038 01039 #if defined _F_REAL16 && _F_REAL16 != (-1) 01040 #ifdef _UNICOS 01041 #pragma _CRI duplicate _MAXVAL0_D as MAXVAL0_D@ 01042 #endif 01043 _f_real16 01044 _MAXVAL0_D ( DopeVectorType * source, 01045 _f_int * dimp, 01046 DopeVectorType * mask) 01047 { 01048 void __maxval(); 01049 int i = 1; 01050 _f_real16 s16; 01051 DopeVectorType result, *res_ptr; 01052 01053 s16 = (_f_real16) -HUGE_REAL16_F90; 01054 res_ptr = (DopeVectorType *) &result; 01055 res_ptr->assoc = 1; 01056 res_ptr->base_addr.a.ptr = (_f_real16 *) &s16; 01057 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 01058 res_ptr->ptr_alloc = 0; 01059 res_ptr->p_or_a = NOT_P_OR_A; 01060 res_ptr->n_dim = 0; 01061 res_ptr->type_lens.type = DVTYPE_REAL; 01062 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 01063 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 01064 res_ptr->type_lens.int_len = source->type_lens.int_len; 01065 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 01066 res_ptr->orig_base = (_f_real16 *) NULL; 01067 res_ptr->orig_size = 0; 01068 __maxval (res_ptr, source, dimp, mask, 1, DVSUBTYPE_REAL128, 01069 USE_REAL16); 01070 return(*(_f_real16 *) res_ptr->base_addr.a.ptr); 01071 } 01072 01073 _f_real16 01074 _MAXVAL0__D ( DopeVectorType * source, 01075 DopeVectorType * dimp, 01076 DopeVectorType * mask) 01077 { 01078 void __maxval(); 01079 int i = 1; 01080 _f_real16 s16; 01081 DopeVectorType result, *res_ptr; 01082 DopeVectorType *dm, *mk; 01083 _f_int *dimenp = NULL; 01084 _f_int dimenlc = 0; 01085 01086 LOAD_DM_MK(); 01087 s16 = (_f_real16) -HUGE_REAL16_F90; 01088 res_ptr = (DopeVectorType *) &result; 01089 res_ptr->assoc = 1; 01090 res_ptr->base_addr.a.ptr = (_f_real16 *) &s16; 01091 res_ptr->base_addr.a.el_len = source->base_addr.a.el_len; 01092 res_ptr->ptr_alloc = 0; 01093 res_ptr->p_or_a = NOT_P_OR_A; 01094 res_ptr->n_dim = 0; 01095 res_ptr->type_lens.type = DVTYPE_REAL; 01096 res_ptr->type_lens.dpflag = source->type_lens.dpflag; 01097 res_ptr->type_lens.kind_or_star = source->type_lens.kind_or_star; 01098 res_ptr->type_lens.int_len = source->type_lens.int_len; 01099 res_ptr->type_lens.dec_len = source->type_lens.dec_len; 01100 res_ptr->orig_base = (_f_real16 *) NULL; 01101 res_ptr->orig_size = 0; 01102 __maxval (res_ptr, source, dimenp, mk, 1, DVSUBTYPE_REAL128, 01103 USE_REAL16); 01104 return(*(_f_real16 *) res_ptr->base_addr.a.ptr); 01105 } 01106 #endif 01107 01108 void 01109 __maxval ( DopeVectorType * result, 01110 DopeVectorType * source, 01111 _f_int * dimp, 01112 DopeVectorType * mask, 01113 int scalar, 01114 int subtype, 01115 int init_val) 01116 01117 { 01118 _f_int4 * restrict i4ptr1; /* 32-bit int */ 01119 _f_int4 * restrict i4ptr2; /* 32-bit int */ 01120 #ifdef _F_INT6 01121 _f_int6 * restrict i6ptr1; /* 46-bit int */ 01122 _f_int6 * restrict i6ptr2; /* 46-bit int */ 01123 #endif 01124 _f_int8 * restrict i8ptr1; /* 64-bit int */ 01125 _f_int8 * restrict i8ptr2; /* 64-bit int */ 01126 _f_real8 * restrict r8ptr1; /* 64-bit real */ 01127 _f_real8 * restrict r8ptr2; /* 64-bit real */ 01128 #if defined _F_REAL16 && _F_REAL16 != (-1) 01129 _f_real16 * restrict r16ptr1; /* 128-bit real */ 01130 _f_real16 * restrict r16ptr2; /* 128-bit real */ 01131 #endif 01132 _f_real4 * restrict r4ptr1; /* 32-bit real */ 01133 _f_real4 * restrict r4ptr2; /* 32-bit real */ 01134 _f_mask * restrict lptr; /* "logical" */ 01135 void * restrict sptr; /* source */ 01136 void * restrict rptr; /* result */ 01137 void * restrict mptr; /* mask */ 01138 _f_int dim; /* dimension to check */ 01139 _f_int bucketsize; /* size of elements */ 01140 long nbytes; /* number of bytes */ 01141 long sindx; /* source index */ 01142 long rindx; /* result index */ 01143 long mindx; /* mask index */ 01144 _f_int type; /* result type */ 01145 _f_int rank; /* rank of source matrix */ 01146 long src_ext[MAXDIM]; /* extents for source */ 01147 long src_strd[MAXDIM]; /* strides for source */ 01148 long src_off[MAXDIM]; /* offset */ 01149 long res_ext[MAXDIM]; /* extents for source */ 01150 long res_strd[MAXDIM]; /* strides for source */ 01151 long res_off[MAXDIM]; /* offset */ 01152 long msk_ext[MAXDIM]; /* extents for source */ 01153 long msk_strd[MAXDIM]; /* strides for source */ 01154 long msk_off[MAXDIM]; /* offset */ 01155 long curdim[MAXDIM]; /* current index counter */ 01156 long src_dim_ext; /* dim index extent */ 01157 long src_dim_strd; /* dim index stride */ 01158 long msk_dim_ext; /* dim index extent */ 01159 long msk_dim_strd; /* dim index stride */ 01160 long indx1_src; /* index for dim 1 of source */ 01161 long indx1_res; /* index for dim 1 of source */ 01162 long indx1_msk; /* index for dim 1 of source */ 01163 long tot_ext; /* total extent counter */ 01164 _f_int ndim; /* non_dim index */ 01165 _f_int first; /* first flag */ 01166 _f_int4 cur_maxi4; /* current maximum value */ 01167 _f_int4 i32_result; /* scalar integer result */ 01168 _f_int4 use_int4; /* holder for default ret val */ 01169 #ifdef _F_INT6 01170 _f_int6 cur_maxi; /* current maximum value */ 01171 _f_int6 i46_result; /* scalar integer result */ 01172 _f_int6 use_int6; /* holder for default ret val */ 01173 #endif 01174 _f_int8 cur_maxj; /* current maximum value */ 01175 _f_int8 i64_result; /* scalar integer result */ 01176 _f_real8 cur_maxf; /* current maximum value */ 01177 _f_real8 s64_result; /* scalar float result */ 01178 _f_real8 use_flt8; /* holder for default ret val */ 01179 #if defined _F_REAL16 && _F_REAL16 != (-1) 01180 _f_real16 cur_maxd; /* current maximum value */ 01181 _f_real16 s128_result; /* scalar double result */ 01182 #endif 01183 _f_real4 cur_maxs4; /* current maximin value */ 01184 _f_real4 s32_result; /* scalar result */ 01185 _f_int use_mask; /* use mask flag */ 01186 long i, j; /* index variables */ 01187 long mask_el_len; 01188 _f_int early_exit; /* early exit flag */ 01189 01190 /* 01191 * Set up local copies of the number of dimensions in the source 01192 * array (rank) and the source array data type (type). 01193 */ 01194 01195 type = source->type_lens.type; 01196 rank = source->n_dim; 01197 01198 /* 01199 * If any extent in any matrix has value 0, we can exit without doing 01200 * any work. 01201 */ 01202 01203 early_exit = 0; 01204 for (i = 0; i < rank; i++) { 01205 if (source->dimension[i].extent == 0) 01206 early_exit = 1; 01207 } 01208 if (result->assoc) { 01209 if (!scalar) { 01210 for (i = 0; i < result->n_dim; i++) { 01211 if (result->dimension[i].extent == 0) 01212 early_exit = 1; 01213 } 01214 } 01215 } 01216 if (mask) { 01217 for (i = 0; i < mask->n_dim; i++) { 01218 if (mask->dimension[i].extent == 0) 01219 early_exit = 1; 01220 } 01221 } 01222 01223 /* 01224 * Initialize every array element to 0. 01225 */ 01226 01227 #ifdef _UNICOS 01228 #pragma _CRI shortloop 01229 #endif 01230 for (i = 0; i < MAXDIM; i++) { 01231 curdim[i] = 0; 01232 src_ext[i] = 0; 01233 src_strd[i] = 0; 01234 src_off[i] = 0; 01235 res_ext[i] = 0; 01236 res_strd[i] = 0; 01237 res_off[i] = 0; 01238 msk_ext[i] = 0; 01239 msk_strd[i] = 0; 01240 msk_off[i] = 0; 01241 } 01242 01243 /* 01244 * Set up dim variable. It must be decremented by one to account 01245 * for the difference in reference between C and FORTRAN 01246 */ 01247 01248 if (dimp != NULL && rank > 0) { 01249 dim = *dimp - 1; 01250 if (dim < 0 || dim >= rank) 01251 _lerror (_LELVL_ABORT, FESCIDIM); 01252 } else { 01253 dim = 0; 01254 } 01255 01256 /* Set bucketsize scalar */ 01257 01258 bucketsize = source->type_lens.int_len / BITS_PER_WORD; 01259 #ifdef _CRAYMPP 01260 if (bucketsize == 0) 01261 bucketsize = 1; 01262 #endif 01263 01264 /* Set up dope vector for result array */ 01265 01266 if (!result->assoc) { 01267 result->base_addr.a.ptr = (void *) NULL; 01268 result->orig_base = 0; 01269 result->orig_size = 0; 01270 01271 tot_ext = bucketsize; 01272 nbytes = bucketsize * BYTES_PER_WORD; 01273 if (dimp == NULL || rank == 1) { 01274 result->n_dim = 0; 01275 } else { 01276 result->n_dim = rank - 1; 01277 for (i = 0; i < dim; i++) { 01278 result->dimension[i].extent = 01279 source->dimension[i].extent; 01280 result->dimension[i].low_bound = 1; 01281 result->dimension[i].stride_mult = tot_ext; 01282 tot_ext *= result->dimension[i].extent; 01283 nbytes *= result->dimension[i].extent; 01284 } 01285 for ( ; i < rank-1; i++) { 01286 result->dimension[i].extent = 01287 source->dimension[i+1].extent; 01288 result->dimension[i].low_bound = 1; 01289 result->dimension[i].stride_mult = tot_ext; 01290 tot_ext *= result->dimension[i].extent; 01291 nbytes *= result->dimension[i].extent; 01292 } 01293 } 01294 01295 if (!scalar) { 01296 if (nbytes > 0) { 01297 result->base_addr.a.ptr = (void *) malloc (nbytes); 01298 if (result->base_addr.a.ptr == NULL) 01299 _lerror (_LELVL_ABORT, FENOMEMY); 01300 } 01301 result->assoc = 1; 01302 } else { 01303 if (subtype == DVSUBTYPE_INT64) 01304 result->base_addr.a.ptr = (_f_int8 *) &i64_result; 01305 #ifdef _F_INT6 01306 else if (subtype == DVSUBTYPE_INT46) 01307 result->base_addr.a.ptr = (_f_int6 *) &i46_result; 01308 #endif 01309 else if (subtype == DVSUBTYPE_INT32) 01310 result->base_addr.a.ptr = (_f_int4 *) &i32_result; 01311 else if (subtype == DVSUBTYPE_REAL32) 01312 result->base_addr.a.ptr = (_f_real4 *) &s32_result; 01313 #if defined _F_REAL16 && _F_REAL16 != (-1) 01314 else if (subtype == DVSUBTYPE_REAL128) 01315 result->base_addr.a.ptr = (_f_real16 *) &s128_result; 01316 #endif 01317 else 01318 result->base_addr.a.ptr = (_f_real8 *) &s64_result; 01319 } 01320 result->base_addr.a.el_len = source->base_addr.a.el_len; 01321 result->orig_base = (void *) result->base_addr.a.ptr; 01322 result->orig_size = nbytes * BITS_PER_BYTE; 01323 } else { 01324 tot_ext = bucketsize; 01325 if (dimp == NULL || rank == 1) { 01326 for (i = 0; i < rank; i++) 01327 tot_ext *= source->dimension[i].extent; 01328 } else { 01329 for (i = 0; i < dim; i++) 01330 tot_ext *= source->dimension[i].extent; 01331 for ( ; i < rank-1; i++) 01332 tot_ext *= source->dimension[i].extent; 01333 } 01334 } 01335 01336 /* Set up scalar pointers to all of the argument data areas */ 01337 01338 sptr = (void *) source->base_addr.a.ptr; 01339 rptr = (void *) result->base_addr.a.ptr; 01340 if (mask) 01341 mptr = (void *) mask->base_addr.a.ptr; 01342 01343 /* 01344 * If mask is present as a scalar, and its value is false, we can 01345 * exit early. 01346 */ 01347 01348 if (mask) { 01349 mask_el_len = mask->base_addr.a.el_len; 01350 lptr = (_f_mask *) mptr; 01351 if (mask->n_dim == 0 && !LTOB(mask_el_len, &lptr[0])) 01352 early_exit = 1; 01353 else { 01354 if (mask->n_dim == 0) /* scalar true mask */ 01355 use_mask = 0; /* don't need to check */ 01356 else 01357 use_mask = 1; 01358 } 01359 } else { 01360 use_mask = 0; 01361 } 01362 01363 /* 01364 * If any of our pre-defined early exit conditions have been met, 01365 * we can exit now. 01366 */ 01367 01368 if (early_exit) { 01369 if (scalar) { 01370 if (subtype == DVSUBTYPE_INT64) { 01371 i8ptr2 = (_f_int8 *) rptr; 01372 i8ptr2[0] = -HUGE_INT8_F90; 01373 #ifdef _F_INT6 01374 } else if (subtype == DVSUBTYPE_INT46) { 01375 i6ptr2 = (_f_int6 *) rptr; 01376 if (init_val == USE_INT6) 01377 i6ptr2[0] = -HUGE_INT6_F90; 01378 else if (init_val == USE_INT4) 01379 i6ptr2[0] = -HUGE_INT4_F90; 01380 else if (init_val == USE_INT2) 01381 i6ptr2[0] = -HUGE_INT2_F90; 01382 else 01383 i6ptr2[0] = -HUGE_INT1_F90; 01384 #else 01385 } else if (subtype == DVSUBTYPE_INT32) { 01386 i4ptr2 = (_f_int4 *) rptr; 01387 if (init_val == USE_INT4) 01388 i4ptr2[0] = -HUGE_INT4_F90; 01389 else if (init_val == USE_INT2) 01390 i4ptr2[0] = -HUGE_INT2_F90; 01391 else 01392 i4ptr2[0] = -HUGE_INT1_F90; 01393 #endif 01394 #if defined _F_REAL16 && _F_REAL16 != (-1) 01395 } else if (subtype == DVSUBTYPE_REAL128) { 01396 r16ptr2 = (_f_real16 *) rptr; 01397 r16ptr2[0] = -HUGE_REAL16_F90; 01398 #endif 01399 } else if (subtype == DVSUBTYPE_REAL32) { 01400 r4ptr2 = (_f_real4 *) rptr; 01401 r4ptr2[0] = -HUGE_REAL4_F90; 01402 } else { 01403 r8ptr2 = (_f_real8 *) rptr; 01404 if (init_val == USE_REAL8) 01405 r8ptr2[0] = -HUGE_REAL8_F90; 01406 else 01407 r8ptr2[0] = -HUGE_REAL4_F90; 01408 } 01409 } else { 01410 for (i = 0; i < rank-1; i++) { 01411 res_strd[i] = result->dimension[i].stride_mult / bucketsize; 01412 res_ext[i] = result->dimension[i].extent; 01413 curdim[i] = 0; 01414 } 01415 rindx = 0; 01416 if (subtype == DVSUBTYPE_INT64) { 01417 i8ptr2 = (_f_int8 *) rptr; 01418 for (i = 0; i < tot_ext; i++) { 01419 i8ptr2[rindx] = -HUGE_INT8_F90; 01420 INCR_RES(); 01421 } 01422 #ifdef _F_INT6 01423 } else if (subtype == DVSUBTYPE_INT46) { 01424 i6ptr2 = (_f_int6 *) rptr; 01425 if (init_val == USE_INT6) 01426 use_int6 = -HUGE_INT6_F90; 01427 else if (init_val == USE_INT4) 01428 use_int6 = -HUGE_INT4_F90; 01429 else if (init_val == USE_INT2) 01430 use_int6 = -HUGE_INT2_F90; 01431 else 01432 use_int6 = -HUGE_INT1_F90; 01433 for (i = 0; i < tot_ext; i++) { 01434 i6ptr2[rindx] = use_int6; 01435 INCR_RES(); 01436 } 01437 #endif 01438 } else if (subtype == DVSUBTYPE_INT32) { 01439 i4ptr2 = (_f_int4 *) rptr; 01440 if (init_val == USE_INT4) 01441 use_int4 = -HUGE_INT4_F90; 01442 else if (init_val == USE_INT2) 01443 use_int4 = -HUGE_INT2_F90; 01444 else 01445 use_int4 = -HUGE_INT1_F90; 01446 for (i = 0; i < tot_ext; i++) { 01447 i4ptr2[rindx] = use_int4; 01448 INCR_RES(); 01449 } 01450 #if defined _F_REAL16 && _F_REAL16 != (-1) 01451 } else if (subtype == DVSUBTYPE_REAL128) { 01452 r16ptr2 = (_f_real16 *) rptr; 01453 for (i = 0; i < tot_ext; i++) { 01454 r16ptr2[rindx] = -HUGE_REAL16_F90; 01455 INCR_RES(); 01456 } 01457 #endif 01458 } else if (subtype == DVSUBTYPE_REAL32) { 01459 r4ptr2 = (_f_real4 *) rptr; 01460 for (i = 0; i < tot_ext; i++) { 01461 r4ptr2[rindx] = -HUGE_REAL4_F90; 01462 INCR_RES(); 01463 } 01464 } else { 01465 r8ptr2 = (_f_real8 *) rptr; 01466 if (init_val == USE_REAL8) 01467 use_flt8 = -HUGE_REAL8_F90; 01468 else 01469 use_flt8 = -HUGE_REAL4_F90; 01470 for (i = 0; i < tot_ext; i++) { 01471 r8ptr2[rindx] = use_flt8; 01472 INCR_RES(); 01473 } 01474 } 01475 } 01476 return; 01477 } 01478 01479 if (rank == 1) { 01480 if (bucketsize > 1) 01481 src_strd[0] = source->dimension[0].stride_mult / bucketsize; 01482 else 01483 src_strd[0] = source->dimension[0].stride_mult; 01484 src_ext[0] = source->dimension[0].extent; 01485 if (use_mask) { 01486 if (mask->n_dim > 0) { 01487 msk_strd[0] = mask->dimension[0].stride_mult; 01488 #ifdef _CRAYMPP 01489 if (mask_el_len == 64 && sizeof(lptr[0]) == 4) 01490 msk_strd[0] <<= 1; 01491 #endif 01492 } else 01493 msk_strd[0] = 0; 01494 } 01495 01496 switch (subtype) { 01497 #ifdef _F_INT6 01498 case DVSUBTYPE_INT46 : 01499 i6ptr1 = (_f_int6 *) sptr; 01500 i6ptr2 = (_f_int6 *) rptr; 01501 if (init_val == USE_INT6) 01502 i6ptr2[0] = -HUGE_INT6_F90; 01503 else if (init_val == USE_INT4) 01504 i6ptr2[0] = -HUGE_INT4_F90; 01505 else if (init_val == USE_INT2) 01506 i6ptr2[0] = -HUGE_INT2_F90; 01507 else 01508 i6ptr2[0] = -HUGE_INT1_F90; 01509 if (use_mask) { 01510 lptr = (_f_mask *) mptr; 01511 for (i = 0; i < src_ext[0]; i++) { 01512 mindx = i * msk_strd[0]; 01513 if (LTOB(mask_el_len, &lptr[mindx])) { 01514 sindx = i * src_strd[0]; 01515 if (i6ptr1[sindx] > i6ptr2[0]) 01516 i6ptr2[0] = i6ptr1[sindx]; 01517 } 01518 } 01519 } else { 01520 for (i = 0; i < src_ext[0]; i++) { 01521 sindx = i * src_strd[0]; 01522 if (i6ptr1[sindx] > i6ptr2[0]) 01523 i6ptr2[0] = i6ptr1[sindx]; 01524 } 01525 } 01526 break; 01527 #endif 01528 01529 case DVSUBTYPE_INT32 : 01530 i4ptr1 = (_f_int4 *) sptr; 01531 i4ptr2 = (_f_int4 *) rptr; 01532 if (use_mask) { 01533 lptr = (_f_mask *) mptr; 01534 if (init_val == USE_INT4) 01535 i4ptr2[0] = -HUGE_INT4_F90; 01536 else if (init_val == USE_INT2) 01537 i4ptr2[0] = -HUGE_INT2_F90; 01538 else 01539 i4ptr2[0] = -HUGE_INT1_F90; 01540 for (i = 0; i < src_ext[0]; i++) { 01541 mindx = i * msk_strd[0]; 01542 if (LTOB(mask_el_len, &lptr[mindx])) { 01543 sindx = i * src_strd[0]; 01544 i4ptr2[0] = i4ptr1[sindx]; 01545 break; 01546 } 01547 } 01548 for ( ; i < src_ext[0]; i++) { 01549 mindx = i * msk_strd[0]; 01550 if (LTOB(mask_el_len, &lptr[mindx])) { 01551 sindx = i * src_strd[0]; 01552 if ((i4ptr1[sindx]^i4ptr2[0]) >= 0) { 01553 if (i4ptr1[sindx] > i4ptr2[0]) 01554 i4ptr2[0] = i4ptr1[sindx]; 01555 } else { 01556 if (i4ptr1[sindx] >= 0) 01557 i4ptr2[0] = i4ptr1[sindx]; 01558 } 01559 } 01560 } 01561 } else { 01562 i4ptr2[0] = i4ptr1[0]; 01563 for (i = 1; i < src_ext[0]; i++) { 01564 sindx = i * src_strd[0]; 01565 if ((i4ptr1[sindx]^i4ptr2[0]) >= 0) { 01566 if (i4ptr1[sindx] > i4ptr2[0]) 01567 i4ptr2[0] = i4ptr1[sindx]; 01568 } else { 01569 if (i4ptr1[sindx] >= 0) 01570 i4ptr2[0] = i4ptr1[sindx]; 01571 } 01572 } 01573 } 01574 break; 01575 01576 case DVSUBTYPE_INT64 : 01577 i8ptr1 = (_f_int8 *) sptr; 01578 i8ptr2 = (_f_int8 *) rptr; 01579 if (use_mask) { 01580 lptr = (_f_mask *) mptr; 01581 i8ptr2[0] = -HUGE_INT8_F90; 01582 for (i = 0; i < src_ext[0]; i++) { 01583 mindx = i * msk_strd[0]; 01584 if (LTOB(mask_el_len, &lptr[mindx])) { 01585 sindx = i * src_strd[0]; 01586 i8ptr2[0] = i8ptr1[sindx]; 01587 break; 01588 } 01589 } 01590 for ( ; i < src_ext[0]; i++) { 01591 mindx = i * msk_strd[0]; 01592 if (LTOB(mask_el_len, &lptr[mindx])) { 01593 sindx = i * src_strd[0]; 01594 if ((i8ptr1[sindx]^i8ptr2[0]) >= 0) { 01595 if (i8ptr1[sindx] > i8ptr2[0]) 01596 i8ptr2[0] = i8ptr1[sindx]; 01597 } else { 01598 if (i8ptr1[sindx] >= 0) 01599 i8ptr2[0] = i8ptr1[sindx]; 01600 } 01601 } 01602 } 01603 } else { 01604 i8ptr2[0] = i8ptr1[0]; 01605 for (i = 1; i < src_ext[0]; i++) { 01606 sindx = i * src_strd[0]; 01607 if ((i8ptr1[sindx]^i8ptr2[0]) >= 0) { 01608 if (i8ptr1[sindx] > i8ptr2[0]) 01609 i8ptr2[0] = i8ptr1[sindx]; 01610 } else { 01611 if (i8ptr1[sindx] >= 0) 01612 i8ptr2[0] = i8ptr1[sindx]; 01613 } 01614 } 01615 } 01616 break; 01617 01618 case DVSUBTYPE_REAL64 : 01619 r8ptr1 = (_f_real8 *) sptr; 01620 r8ptr2 = (_f_real8 *) rptr; 01621 if (init_val == USE_REAL8) 01622 r8ptr2[0] = -HUGE_REAL8_F90; 01623 else 01624 r8ptr2[0] = -HUGE_REAL4_F90; 01625 if (use_mask) { 01626 lptr = (_f_mask *) mptr; 01627 for (i = 0; i < src_ext[0]; i++) { 01628 mindx = i * msk_strd[0]; 01629 if (LTOB(mask_el_len, &lptr[mindx])) { 01630 sindx = i * src_strd[0]; 01631 if (r8ptr1[sindx] > r8ptr2[0]) 01632 r8ptr2[0] = r8ptr1[sindx]; 01633 } 01634 } 01635 } else { 01636 for (i = 0; i < src_ext[0]; i++) { 01637 sindx = i * src_strd[0]; 01638 if (r8ptr1[sindx] > r8ptr2[0]) 01639 r8ptr2[0] = r8ptr1[sindx]; 01640 } 01641 } 01642 break; 01643 01644 case DVSUBTYPE_REAL32 : 01645 r4ptr1 = (_f_real4 *) sptr; 01646 r4ptr2 = (_f_real4 *) rptr; 01647 r4ptr2[0] = -HUGE_REAL4_F90; 01648 if (use_mask) { 01649 lptr = (_f_mask *) mptr; 01650 for (i = 0; i < src_ext[0]; i++) { 01651 mindx = i * msk_strd[0]; 01652 if (LTOB(mask_el_len, &lptr[mindx])) { 01653 sindx = i * src_strd[0]; 01654 if (r4ptr1[sindx] > r4ptr2[0]) 01655 r4ptr2[0] = r4ptr1[sindx]; 01656 } 01657 } 01658 } else { 01659 for (i = 0; i < src_ext[0]; i++) { 01660 sindx = i * src_strd[0]; 01661 if (r4ptr1[sindx] > r4ptr2[0]) 01662 r4ptr2[0] = r4ptr1[sindx]; 01663 } 01664 } 01665 break; 01666 01667 #if defined _F_REAL16 && _F_REAL16 != (-1) 01668 case DVSUBTYPE_REAL128 : 01669 r16ptr1 = (_f_real16 *) sptr; 01670 r16ptr2 = (_f_real16 *) rptr; 01671 r16ptr2[0] = -HUGE_REAL16_F90; 01672 if (use_mask) { 01673 lptr = (_f_mask *) mptr; 01674 for (i = 0; i < src_ext[0]; i++) { 01675 mindx = i * msk_strd[0]; 01676 if (LTOB(mask_el_len, &lptr[mindx])) { 01677 sindx = i * src_strd[0]; 01678 if (r16ptr1[sindx] > r16ptr2[0]) 01679 r16ptr2[0] = r16ptr1[sindx]; 01680 } 01681 } 01682 } else { 01683 for (i = 0; i < src_ext[0]; i++) { 01684 sindx = i * src_strd[0]; 01685 if (r16ptr1[sindx] > r16ptr2[0]) 01686 r16ptr2[0] = r16ptr1[sindx]; 01687 } 01688 } 01689 break; 01690 #endif 01691 01692 default : 01693 _lerror (_LELVL_ABORT, FEINTDTY); 01694 } 01695 01696 } else if (rank == 2) { 01697 if (bucketsize > 1) { 01698 src_strd[0] = source->dimension[0].stride_mult / bucketsize; 01699 src_strd[1] = source->dimension[1].stride_mult / bucketsize; 01700 } else { 01701 src_strd[0] = source->dimension[0].stride_mult; 01702 src_strd[1] = source->dimension[1].stride_mult; 01703 } 01704 src_ext[0] = source->dimension[0].extent; 01705 src_ext[1] = source->dimension[1].extent; 01706 if (use_mask) { 01707 if (mask->n_dim > 0) { 01708 msk_strd[0] = mask->dimension[0].stride_mult; 01709 msk_strd[1] = mask->dimension[1].stride_mult; 01710 #ifdef _CRAYMPP 01711 if (mask_el_len == 64 && sizeof(lptr[0]) == 4) { 01712 msk_strd[0] <<= 1; 01713 msk_strd[1] <<= 1; 01714 } 01715 #endif 01716 msk_ext[0] = mask->dimension[0].extent; 01717 msk_ext[1] = mask->dimension[1].extent; 01718 } else { 01719 msk_strd[0] = 0; 01720 msk_strd[1] = 0; 01721 msk_ext[0] = 0; 01722 msk_ext[1] = 0; 01723 } 01724 } 01725 01726 if (scalar) { 01727 dim = 0; 01728 ndim = 1; 01729 } else { 01730 res_ext[0] = result->dimension[0].extent; 01731 if (bucketsize > 1) 01732 res_strd[0] = result->dimension[0].stride_mult / bucketsize; 01733 else 01734 res_strd[0] = result->dimension[0].stride_mult; 01735 if (dim == 0) 01736 ndim = 1; 01737 else 01738 ndim = 0; 01739 } 01740 01741 switch (subtype) { 01742 #ifdef _F_INT6 01743 case DVSUBTYPE_INT46 : 01744 i6ptr2 = (_f_int6 *) rptr; 01745 if (init_val == USE_INT6) 01746 cur_maxi = -HUGE_INT6_F90; 01747 else if (init_val == USE_INT4) 01748 cur_maxi = -HUGE_INT4_F90; 01749 else if (init_val == USE_INT2) 01750 cur_maxi = -HUGE_INT2_F90; 01751 else 01752 cur_maxi = -HUGE_INT1_F90; 01753 use_int6 = cur_maxi; 01754 if (use_mask) { 01755 i6ptr1 = (_f_int6 *) sptr; 01756 lptr = (_f_mask *) mptr; 01757 for (i = 0; i < src_ext[ndim]; i++) { 01758 indx1_src = i * src_strd[ndim]; 01759 indx1_msk = i * msk_strd[ndim]; 01760 for (j = 0; j < src_ext[dim]; j++) { 01761 mindx = indx1_msk + (j * msk_strd[dim]); 01762 if (LTOB(mask_el_len, &lptr[mindx])) { 01763 sindx = indx1_src + (j * src_strd[dim]); 01764 if (i6ptr1[sindx] > cur_maxi) 01765 cur_maxi = i6ptr1[sindx]; 01766 } 01767 } 01768 if (!scalar) { 01769 rindx = i * res_strd[0]; 01770 i6ptr2[rindx] = cur_maxi; 01771 cur_maxi = use_int6; 01772 } 01773 } 01774 } else { 01775 i6ptr1 = (_f_int6 *) sptr; 01776 for (i = 0; i < src_ext[ndim]; i++) { 01777 indx1_src = i * src_strd[ndim]; 01778 for (j = 0; j < src_ext[dim]; j++) { 01779 sindx = indx1_src + (j * src_strd[dim]); 01780 if (i6ptr1[sindx] > cur_maxi) 01781 cur_maxi = i6ptr1[sindx]; 01782 } 01783 if (!scalar) { 01784 rindx = i * res_strd[0]; 01785 i6ptr2[rindx] = cur_maxi; 01786 cur_maxi = use_int6; 01787 } 01788 } 01789 } 01790 if (scalar) 01791 i6ptr2[0] = cur_maxi; 01792 break; 01793 #endif 01794 01795 case DVSUBTYPE_INT32 : 01796 i4ptr2 = (_f_int4 *) rptr; 01797 if (init_val == USE_INT4) 01798 cur_maxi4 = -HUGE_INT4_F90; 01799 else if (init_val == USE_INT2) 01800 cur_maxi4 = -HUGE_INT2_F90; 01801 else 01802 cur_maxi4 = -HUGE_INT1_F90; 01803 use_int4 = cur_maxi4; 01804 if (use_mask) { 01805 i4ptr1 = (_f_int4 *) sptr; 01806 lptr = (_f_mask *) mptr; 01807 first = 1; 01808 for (i = 0; i < src_ext[ndim]; i++) { 01809 indx1_src = i * src_strd[ndim]; 01810 indx1_msk = i * msk_strd[ndim]; 01811 for (j = 0; j < src_ext[dim]; j++) { 01812 mindx = indx1_msk + (j * msk_strd[dim]); 01813 if (LTOB(mask_el_len, &lptr[mindx])) { 01814 sindx = indx1_src + (j * src_strd[dim]); 01815 if (!first) { 01816 if ((i4ptr1[sindx]^cur_maxi4) >= 0) { 01817 if (i4ptr1[sindx] > cur_maxi4) 01818 cur_maxi4 = i4ptr1[sindx]; 01819 } else { 01820 if (i4ptr1[sindx] >= 0) 01821 cur_maxi4 = i4ptr1[sindx]; 01822 } 01823 } else { 01824 cur_maxi4 = i4ptr1[sindx]; 01825 first = 0; 01826 } 01827 } 01828 } 01829 if (!scalar) { 01830 rindx = i * res_strd[0]; 01831 i4ptr2[rindx] = cur_maxi4; 01832 cur_maxi4 = use_int4; 01833 first = 1; 01834 } 01835 } 01836 } else { 01837 i4ptr1 = (_f_int4 *) sptr; 01838 first = 1; 01839 for (i = 0; i < src_ext[ndim]; i++) { 01840 indx1_src = i * src_strd[ndim]; 01841 for (j = 0; j < src_ext[dim]; j++) { 01842 sindx = indx1_src + (j * src_strd[dim]); 01843 if (!first) { 01844 if ((i4ptr1[sindx]^cur_maxi4) >= 0) { 01845 if (i4ptr1[sindx] > cur_maxi4) 01846 cur_maxi4 = i4ptr1[sindx]; 01847 } else { 01848 if (i4ptr1[sindx] >= 0) 01849 cur_maxi4 = i4ptr1[sindx]; 01850 } 01851 } else { 01852 cur_maxi4 = i4ptr1[sindx]; 01853 first = 0; 01854 } 01855 } 01856 if (!scalar) { 01857 rindx = i * res_strd[0]; 01858 i4ptr2[rindx] = cur_maxi4; 01859 cur_maxi4 = use_int4; 01860 first = 1; 01861 } 01862 } 01863 } 01864 if (scalar) 01865 i4ptr2[0] = cur_maxi4; 01866 break; 01867 01868 case DVSUBTYPE_INT64 : 01869 i8ptr2 = (_f_int8 *) rptr; 01870 if (use_mask) { 01871 cur_maxj = -HUGE_INT8_F90; 01872 i8ptr1 = (_f_int8 *) sptr; 01873 lptr = (_f_mask *) mptr; 01874 first = 1; 01875 for (i = 0; i < src_ext[ndim]; i++) { 01876 indx1_src = i * src_strd[ndim]; 01877 indx1_msk = i * msk_strd[ndim]; 01878 for (j = 0; j < src_ext[dim]; j++) { 01879 mindx = indx1_msk + (j * msk_strd[dim]); 01880 if (LTOB(mask_el_len, &lptr[mindx])) { 01881 sindx = indx1_src + (j * src_strd[dim]); 01882 if (!first) { 01883 if ((i8ptr1[sindx]^cur_maxj) >= 0) { 01884 if (i8ptr1[sindx] > cur_maxj) 01885 cur_maxj = i8ptr1[sindx]; 01886 } else { 01887 if (i8ptr1[sindx] >= 0) 01888 cur_maxj = i8ptr1[sindx]; 01889 } 01890 } else { 01891 cur_maxj = i8ptr1[sindx]; 01892 first = 0; 01893 } 01894 } 01895 } 01896 if (!scalar) { 01897 rindx = i * res_strd[0]; 01898 i8ptr2[rindx] = cur_maxj; 01899 cur_maxj = -HUGE_INT8_F90; 01900 first = 1; 01901 } 01902 } 01903 } else { 01904 i8ptr1 = (_f_int8 *) sptr; 01905 first = 1; 01906 for (i = 0; i < src_ext[ndim]; i++) { 01907 indx1_src = i * src_strd[ndim]; 01908 for (j = 0; j < src_ext[dim]; j++) { 01909 sindx = indx1_src + (j * src_strd[dim]); 01910 if (!first) { 01911 if ((i8ptr1[sindx]^cur_maxj) >= 0) { 01912 if (i8ptr1[sindx] > cur_maxj) 01913 cur_maxj = i8ptr1[sindx]; 01914 } else { 01915 if (i8ptr1[sindx] >= 0) 01916 cur_maxj = i8ptr1[sindx]; 01917 } 01918 } else { 01919 cur_maxj = i8ptr1[sindx]; 01920 first = 0; 01921 } 01922 } 01923 if (!scalar) { 01924 rindx = i * res_strd[0]; 01925 i8ptr2[rindx] = cur_maxj; 01926 cur_maxj = -HUGE_INT8_F90; 01927 first = 1; 01928 } 01929 } 01930 } 01931 if (scalar) 01932 i8ptr2[0] = cur_maxj; 01933 break; 01934 01935 case DVSUBTYPE_REAL64 : 01936 r8ptr2 = (_f_real8 *) rptr; 01937 if (init_val == USE_REAL8) 01938 cur_maxf = -HUGE_REAL8_F90; 01939 else 01940 cur_maxf = -HUGE_REAL4_F90; 01941 use_flt8 = cur_maxf; 01942 if (use_mask) { 01943 r8ptr1 = (_f_real8 *) sptr; 01944 lptr = (_f_mask *) mptr; 01945 for (i = 0; i < src_ext[ndim]; i++) { 01946 indx1_src = i * src_strd[ndim]; 01947 indx1_msk = i * msk_strd[ndim]; 01948 for (j = 0; j < src_ext[dim]; j++) { 01949 mindx = indx1_msk + (j * msk_strd[dim]); 01950 if (LTOB(mask_el_len, &lptr[mindx])) { 01951 sindx = indx1_src + (j * src_strd[dim]); 01952 if (r8ptr1[sindx] > cur_maxf) 01953 cur_maxf = r8ptr1[sindx]; 01954 } 01955 } 01956 if (!scalar) { 01957 rindx = i * res_strd[0]; 01958 r8ptr2[rindx] = cur_maxf; 01959 cur_maxf = use_flt8; 01960 } 01961 } 01962 } else { 01963 r8ptr1 = (_f_real8 *) sptr; 01964 for (i = 0; i < src_ext[ndim]; i++) { 01965 indx1_src = i * src_strd[ndim]; 01966 for (j = 0; j < src_ext[dim]; j++) { 01967 sindx = indx1_src + (j * src_strd[dim]); 01968 if (r8ptr1[sindx] > cur_maxf) 01969 cur_maxf = r8ptr1[sindx]; 01970 } 01971 if (!scalar) { 01972 rindx = i * res_strd[0]; 01973 r8ptr2[rindx] = cur_maxf; 01974 cur_maxf = use_flt8; 01975 } 01976 } 01977 } 01978 if (scalar) 01979 r8ptr2[0] = cur_maxf; 01980 break; 01981 01982 case DVSUBTYPE_REAL32 : 01983 r4ptr2 = (_f_real4 *) rptr; 01984 cur_maxs4 = -HUGE_REAL4_F90; 01985 if (use_mask) { 01986 r4ptr1 = (_f_real4 *) sptr; 01987 lptr = (_f_mask *) mptr; 01988 for (i = 0; i < src_ext[ndim]; i++) { 01989 indx1_src = i * src_strd[ndim]; 01990 indx1_msk = i * msk_strd[ndim]; 01991 for (j = 0; j < src_ext[dim]; j++) { 01992 mindx = indx1_msk + (j * msk_strd[dim]); 01993 if (LTOB(mask_el_len, &lptr[mindx])) { 01994 sindx = indx1_src + (j * src_strd[dim]); 01995 if (r4ptr1[sindx] > cur_maxs4) 01996 cur_maxs4 = r4ptr1[sindx]; 01997 } 01998 } 01999 if (!scalar) { 02000 rindx = i * res_strd[0]; 02001 r4ptr2[rindx] = cur_maxs4; 02002 cur_maxs4 = -HUGE_REAL4_F90; 02003 } 02004 } 02005 } else { 02006 r4ptr1 = (_f_real4 *) sptr; 02007 for (i = 0; i < src_ext[ndim]; i++) { 02008 indx1_src = i * src_strd[ndim]; 02009 for (j = 0; j < src_ext[dim]; j++) { 02010 sindx = indx1_src + (j * src_strd[dim]); 02011 if (r4ptr1[sindx] > cur_maxs4) 02012 cur_maxs4 = r4ptr1[sindx]; 02013 } 02014 if (!scalar) { 02015 rindx = i * res_strd[0]; 02016 r4ptr2[rindx] = cur_maxs4; 02017 cur_maxs4 = -HUGE_REAL4_F90; 02018 } 02019 } 02020 } 02021 if (scalar) 02022 r4ptr2[0] = cur_maxs4; 02023 break; 02024 02025 #if defined _F_REAL16 && _F_REAL16 != (-1) 02026 case DVSUBTYPE_REAL128 : 02027 r16ptr1 = (_f_real16 *) sptr; 02028 r16ptr2 = (_f_real16 *) rptr; 02029 if (mask) 02030 lptr = (_f_mask *) mptr; 02031 cur_maxd = -HUGE_REAL16_F90; 02032 for (i = 0; i < src_ext[ndim]; i++) { 02033 indx1_src = i * src_strd[ndim]; 02034 indx1_msk = i * msk_strd[ndim]; 02035 for (j = 0; j < src_ext[dim]; j++) { 02036 if (use_mask) { 02037 mindx = indx1_msk + (j * msk_strd[dim]); 02038 if (LTOB(mask_el_len, &lptr[mindx])) { 02039 sindx = indx1_src + (j * src_strd[dim]); 02040 if (r16ptr1[sindx] > cur_maxd) 02041 cur_maxd = r16ptr1[sindx]; 02042 } 02043 } else { 02044 sindx = indx1_src + (j * src_strd[dim]); 02045 if (r16ptr1[sindx] > cur_maxd) 02046 cur_maxd = r16ptr1[sindx]; 02047 } 02048 } 02049 if (!scalar) { 02050 rindx = i * res_strd[0]; 02051 r16ptr2[rindx] = cur_maxd; 02052 cur_maxd = -HUGE_REAL16_F90; 02053 } 02054 } 02055 if (scalar) 02056 r16ptr2[0] = cur_maxd; 02057 break; 02058 #endif 02059 02060 default : 02061 _lerror (_LELVL_ABORT, FEINTDTY); 02062 } 02063 } else { 02064 if (scalar) { 02065 dim = 0; 02066 } else { 02067 #ifdef _UNICOS 02068 #pragma _CRI shortloop 02069 #endif 02070 for (i = 0; i < rank-1; i++) { 02071 res_off[i] = 0; 02072 res_ext[i] = result->dimension[i].extent; 02073 if (bucketsize > 1) 02074 res_strd[i]=result->dimension[i].stride_mult/bucketsize; 02075 else 02076 res_strd[i] = result->dimension[i].stride_mult; 02077 } 02078 } 02079 02080 tot_ext = 1; 02081 for (i = 0; i < dim; i++) { 02082 src_off[i] = 0; 02083 src_ext[i] = source->dimension[i].extent; 02084 if (bucketsize > 1) 02085 src_strd[i] = source->dimension[i].stride_mult / bucketsize; 02086 else 02087 src_strd[i] = source->dimension[i].stride_mult; 02088 if (mask && mask->n_dim > 0) { 02089 msk_ext[i] = mask->dimension[i].extent; 02090 msk_strd[i] = mask->dimension[i].stride_mult; 02091 #ifdef _CRAYMPP 02092 if (mask_el_len == 64 && sizeof(lptr[0]) == 4) 02093 msk_strd[i] <<= 1; 02094 #endif 02095 msk_off[i] = 0; 02096 } else { 02097 msk_strd[i] = 0; 02098 msk_off[i] = 0; 02099 } 02100 tot_ext *= src_ext[i]; 02101 } 02102 02103 src_dim_ext = source->dimension[dim].extent; 02104 if (bucketsize > 1) 02105 src_dim_strd = source->dimension[dim].stride_mult / bucketsize; 02106 else 02107 src_dim_strd = source->dimension[dim].stride_mult; 02108 if (use_mask) { 02109 msk_dim_ext = mask->dimension[dim].extent; 02110 msk_dim_strd = mask->dimension[dim].stride_mult; 02111 #ifdef _CRAYMPP 02112 if (mask_el_len == 64 && sizeof(lptr[0]) == 4) 02113 msk_dim_strd <<= 1; 02114 #endif 02115 } 02116 02117 for ( ; i < rank - 1; i++) { 02118 src_off[i] = 0; 02119 src_ext[i] = source->dimension[i+1].extent; 02120 if (bucketsize > 1) 02121 src_strd[i] = source->dimension[i+1].stride_mult/bucketsize; 02122 else 02123 src_strd[i] = source->dimension[i+1].stride_mult; 02124 if (mask && mask->n_dim > 1) { 02125 msk_ext[i] = mask->dimension[i+1].extent; 02126 msk_strd[i] = mask->dimension[i+1].stride_mult; 02127 #ifdef _CRAYMPP 02128 if (mask_el_len == 64 && sizeof(lptr[0]) == 4) 02129 msk_strd[i] <<= 1; 02130 #endif 02131 msk_off[i] = 0; 02132 } else { 02133 msk_strd[i] = 0; 02134 msk_off[i] = 0; 02135 } 02136 tot_ext *= src_ext[i]; 02137 } 02138 02139 /* Initialize curdim array */ 02140 02141 for (i = 0; i < rank - 1; i++) 02142 curdim[i] = 0; 02143 02144 switch (subtype) { 02145 #ifdef _F_INT6 02146 case DVSUBTYPE_INT46 : 02147 i6ptr2 = (_f_int6 *) rptr; 02148 if (init_val == USE_INT6) 02149 cur_maxi = -HUGE_INT6_F90; 02150 else if (init_val == USE_INT4) 02151 cur_maxi = -HUGE_INT4_F90; 02152 else if (init_val == USE_INT2) 02153 cur_maxi = -HUGE_INT2_F90; 02154 else 02155 cur_maxi = -HUGE_INT1_F90; 02156 use_int6 = cur_maxi; 02157 if (use_mask) { 02158 i6ptr1 = (_f_int6 *) sptr; 02159 lptr = (_f_mask *) mptr; 02160 for (i = 0; i < tot_ext; i++) { 02161 indx1_src = 0; 02162 indx1_msk = 0; 02163 for (j = 0; j < rank - 1; j++) { 02164 indx1_src += src_off[j]; 02165 indx1_msk += msk_off[j]; 02166 } 02167 for (j = 0; j < src_dim_ext; j++) { 02168 mindx = indx1_msk + (j * msk_dim_strd); 02169 if (LTOB(mask_el_len, &lptr[mindx])) { 02170 sindx = indx1_src + (j * src_dim_strd); 02171 if (i6ptr1[sindx] > cur_maxi) 02172 cur_maxi = i6ptr1[sindx]; 02173 } 02174 } 02175 if (!scalar) { 02176 indx1_res = 0; 02177 for (j = 0; j < rank - 1; j++) 02178 indx1_res += res_off[j]; 02179 i6ptr2[indx1_res] = cur_maxi; 02180 cur_maxi = use_int6; 02181 } 02182 INCREMENT(); 02183 } 02184 } else { 02185 i6ptr1 = (_f_int6 *) sptr; 02186 for (i = 0; i < tot_ext; i++) { 02187 indx1_src = 0; 02188 for (j = 0; j < rank - 1; j++) 02189 indx1_src += src_off[j]; 02190 for (j = 0; j < src_dim_ext; j++) { 02191 sindx = indx1_src + (j * src_dim_strd); 02192 if (i6ptr1[sindx] > cur_maxi) 02193 cur_maxi = i6ptr1[sindx]; 02194 } 02195 if (!scalar) { 02196 indx1_res = 0; 02197 for (j = 0; j < rank - 1; j++) 02198 indx1_res += res_off[j]; 02199 i6ptr2[indx1_res] = cur_maxi; 02200 cur_maxi = use_int6; 02201 } 02202 INCREMENT(); 02203 } 02204 } 02205 if (scalar) 02206 i6ptr2[0] = cur_maxi; 02207 break; 02208 #endif 02209 02210 case DVSUBTYPE_INT32 : 02211 i4ptr2 = (_f_int4 *) rptr; 02212 if (init_val == USE_INT4) 02213 cur_maxi4 = -HUGE_INT4_F90; 02214 else if (init_val == USE_INT2) 02215 cur_maxi4 = -HUGE_INT2_F90; 02216 else 02217 cur_maxi4 = -HUGE_INT1_F90; 02218 use_int4 = cur_maxi4; 02219 if (use_mask) { 02220 i4ptr1 = (_f_int4 *) sptr; 02221 lptr = (_f_mask *) mptr; 02222 first = 1; 02223 for (i = 0; i < tot_ext; i++) { 02224 indx1_src = 0; 02225 indx1_msk = 0; 02226 for (j = 0; j < rank - 1; j++) { 02227 indx1_src += src_off[j]; 02228 indx1_msk += msk_off[j]; 02229 } 02230 for (j = 0; j < src_dim_ext; j++) { 02231 mindx = indx1_msk + (j * msk_dim_strd); 02232 if (LTOB(mask_el_len, &lptr[mindx])) { 02233 sindx = indx1_src + (j * src_dim_strd); 02234 if (!first) { 02235 if ((i4ptr1[sindx]^cur_maxi4) >= 0) { 02236 if (i4ptr1[sindx] > cur_maxi4) 02237 cur_maxi4 = i4ptr1[sindx]; 02238 } else { 02239 if (i4ptr1[sindx] >= 0) 02240 cur_maxi4 = i4ptr1[sindx]; 02241 } 02242 } else { 02243 cur_maxi4 = i4ptr1[sindx]; 02244 first = 0; 02245 } 02246 } 02247 } 02248 if (!scalar) { 02249 indx1_res = 0; 02250 for (j = 0; j < rank - 1; j++) 02251 indx1_res += res_off[j]; 02252 i4ptr2[indx1_res] = cur_maxi4; 02253 cur_maxi4 = use_int4; 02254 first = 1; 02255 } 02256 INCREMENT(); 02257 } 02258 } else { 02259 i4ptr1 = (_f_int4 *) sptr; 02260 first = 1; 02261 for (i = 0; i < tot_ext; i++) { 02262 indx1_src = 0; 02263 for (j = 0; j < rank - 1; j++) 02264 indx1_src += src_off[j]; 02265 for (j = 0; j < src_dim_ext; j++) { 02266 sindx = indx1_src + (j * src_dim_strd); 02267 if (!first) { 02268 if ((i4ptr1[sindx]^cur_maxi4) >= 0) { 02269 if (i4ptr1[sindx] > cur_maxi4) 02270 cur_maxi4 = i4ptr1[sindx]; 02271 } else { 02272 if (i4ptr1[sindx] >= 0) 02273 cur_maxi4 = i4ptr1[sindx]; 02274 } 02275 } else { 02276 cur_maxi4 = i4ptr1[sindx]; 02277 first = 0; 02278 } 02279 } 02280 if (!scalar) { 02281 indx1_res = 0; 02282 for (j = 0; j < rank - 1; j++) 02283 indx1_res += res_off[j]; 02284 i4ptr2[indx1_res] = cur_maxi4; 02285 cur_maxi4 = use_int4; 02286 first = 1; 02287 } 02288 INCREMENT(); 02289 } 02290 } 02291 if (scalar) 02292 i4ptr2[0] = cur_maxi4; 02293 break; 02294 02295 case DVSUBTYPE_INT64 : 02296 i8ptr2 = (_f_int8 *) rptr; 02297 cur_maxj = -HUGE_INT8_F90; 02298 if (use_mask) { 02299 i8ptr1 = (_f_int8 *) sptr; 02300 lptr = (_f_mask *) mptr; 02301 first = 1; 02302 for (i = 0; i < tot_ext; i++) { 02303 indx1_src = 0; 02304 indx1_msk = 0; 02305 for (j = 0; j < rank - 1; j++) { 02306 indx1_src += src_off[j]; 02307 indx1_msk += msk_off[j]; 02308 } 02309 for (j = 0; j < src_dim_ext; j++) { 02310 mindx = indx1_msk + (j * msk_dim_strd); 02311 if (LTOB(mask_el_len, &lptr[mindx])) { 02312 sindx = indx1_src + (j * src_dim_strd); 02313 if (!first) { 02314 if ((i8ptr1[sindx]^cur_maxj) >= 0) { 02315 if (i8ptr1[sindx] > cur_maxj) 02316 cur_maxj = i8ptr1[sindx]; 02317 } else { 02318 if (i8ptr1[sindx] >= 0) 02319 cur_maxj = i8ptr1[sindx]; 02320 } 02321 } else { 02322 cur_maxj = i8ptr1[sindx]; 02323 first = 0; 02324 } 02325 } 02326 } 02327 if (!scalar) { 02328 indx1_res = 0; 02329 for (j = 0; j < rank - 1; j++) 02330 indx1_res += res_off[j]; 02331 i8ptr2[indx1_res] = cur_maxj; 02332 cur_maxj = -HUGE_INT8_F90; 02333 first = 1; 02334 } 02335 INCREMENT(); 02336 } 02337 } else { 02338 i8ptr1 = (_f_int8 *) sptr; 02339 first = 1; 02340 for (i = 0; i < tot_ext; i++) { 02341 indx1_src = 0; 02342 for (j = 0; j < rank - 1; j++) 02343 indx1_src += src_off[j]; 02344 for (j = 0; j < src_dim_ext; j++) { 02345 sindx = indx1_src + (j * src_dim_strd); 02346 if (!first) { 02347 if ((i8ptr1[sindx]^cur_maxj) >= 0) { 02348 if (i8ptr1[sindx] > cur_maxj) 02349 cur_maxj = i8ptr1[sindx]; 02350 } else { 02351 if (i8ptr1[sindx] >= 0) 02352 cur_maxj = i8ptr1[sindx]; 02353 } 02354 } else { 02355 cur_maxj = i8ptr1[sindx]; 02356 first = 0; 02357 } 02358 } 02359 if (!scalar) { 02360 indx1_res = 0; 02361 for (j = 0; j < rank - 1; j++) 02362 indx1_res += res_off[j]; 02363 i8ptr2[indx1_res] = cur_maxj; 02364 cur_maxj = -HUGE_INT8_F90; 02365 first = 1; 02366 } 02367 INCREMENT(); 02368 } 02369 } 02370 if (scalar) 02371 i8ptr2[0] = cur_maxj; 02372 break; 02373 02374 case DVSUBTYPE_REAL64 : 02375 r8ptr2 = (_f_real8 *) rptr; 02376 if (init_val == USE_REAL8) 02377 cur_maxf = -HUGE_REAL8_F90; 02378 else 02379 cur_maxf = -HUGE_REAL4_F90; 02380 use_flt8 = cur_maxf; 02381 if (use_mask) { 02382 r8ptr1 = (_f_real8 *) sptr; 02383 lptr = (_f_mask *) mptr; 02384 for (i = 0; i < tot_ext; i++) { 02385 indx1_src = 0; 02386 indx1_msk = 0; 02387 for (j = 0; j < rank - 1; j++) { 02388 indx1_src += src_off[j]; 02389 indx1_msk += msk_off[j]; 02390 } 02391 for (j = 0; j < src_dim_ext; j++) { 02392 mindx = indx1_msk + (j * msk_dim_strd); 02393 if (LTOB(mask_el_len, &lptr[mindx])) { 02394 sindx = indx1_src + (j * src_dim_strd); 02395 if (r8ptr1[sindx] > cur_maxf) 02396 cur_maxf = r8ptr1[sindx]; 02397 } 02398 } 02399 if (!scalar) { 02400 indx1_res = 0; 02401 for (j = 0; j < rank - 1; j++) 02402 indx1_res += res_off[j]; 02403 r8ptr2[indx1_res] = cur_maxf; 02404 cur_maxf = use_flt8; 02405 } 02406 INCREMENT(); 02407 } 02408 } else { 02409 r8ptr1 = (_f_real8 *) sptr; 02410 for (i = 0; i < tot_ext; i++) { 02411 indx1_src = 0; 02412 for (j = 0; j < rank - 1; j++) 02413 indx1_src += src_off[j]; 02414 for (j = 0; j < src_dim_ext; j++) { 02415 sindx = indx1_src + (j * src_dim_strd); 02416 if (r8ptr1[sindx] > cur_maxf) 02417 cur_maxf = r8ptr1[sindx]; 02418 } 02419 if (!scalar) { 02420 indx1_res = 0; 02421 for (j = 0; j < rank - 1; j++) 02422 indx1_res += res_off[j]; 02423 r8ptr2[indx1_res] = cur_maxf; 02424 cur_maxf = use_flt8; 02425 } 02426 INCREMENT(); 02427 } 02428 } 02429 if (scalar) 02430 r8ptr2[0] = cur_maxf; 02431 break; 02432 02433 case DVSUBTYPE_REAL32 : 02434 r4ptr2 = (_f_real4 *) rptr; 02435 cur_maxs4 = -HUGE_REAL4_F90; 02436 if (use_mask) { 02437 r4ptr1 = (_f_real4 *) sptr; 02438 lptr = (_f_mask *) mptr; 02439 for (i = 0; i < tot_ext; i++) { 02440 indx1_src = 0; 02441 indx1_msk = 0; 02442 for (j = 0; j < rank - 1; j++) { 02443 indx1_src += src_off[j]; 02444 indx1_msk += msk_off[j]; 02445 } 02446 for (j = 0; j < src_dim_ext; j++) { 02447 mindx = indx1_msk + (j * msk_dim_strd); 02448 if (LTOB(mask_el_len, &lptr[mindx])) { 02449 sindx = indx1_src + (j * src_dim_strd); 02450 if (r4ptr1[sindx] > cur_maxs4) 02451 cur_maxs4 = r4ptr1[sindx]; 02452 } 02453 } 02454 if (!scalar) { 02455 indx1_res = 0; 02456 for (j = 0; j < rank - 1; j++) 02457 indx1_res += res_off[j]; 02458 r4ptr2[indx1_res] = cur_maxs4; 02459 cur_maxs4 = -HUGE_REAL4_F90; 02460 } 02461 INCREMENT(); 02462 } 02463 } else { 02464 r4ptr1 = (_f_real4 *) sptr; 02465 for (i = 0; i < tot_ext; i++) { 02466 indx1_src = 0; 02467 for (j = 0; j < rank - 1; j++) 02468 indx1_src += src_off[j]; 02469 for (j = 0; j < src_dim_ext; j++) { 02470 sindx = indx1_src + (j * src_dim_strd); 02471 if (r4ptr1[sindx] > cur_maxs4) 02472 cur_maxs4 = r4ptr1[sindx]; 02473 } 02474 if (!scalar) { 02475 indx1_res = 0; 02476 for (j = 0; j < rank - 1; j++) 02477 indx1_res += res_off[j]; 02478 r4ptr2[indx1_res] = cur_maxs4; 02479 cur_maxs4 = -HUGE_REAL4_F90; 02480 } 02481 INCREMENT(); 02482 } 02483 } 02484 if (scalar) 02485 r4ptr2[0] = cur_maxs4; 02486 break; 02487 02488 #if defined _F_REAL16 && _F_REAL16 != (-1) 02489 case DVSUBTYPE_REAL128 : 02490 r16ptr1 = (_f_real16 *) sptr; 02491 r16ptr2 = (_f_real16 *) rptr; 02492 if (mask) 02493 lptr = (_f_mask *) mptr; 02494 cur_maxd = -HUGE_REAL16_F90; 02495 for (i = 0; i < tot_ext; i++) { 02496 indx1_src = 0; 02497 if (use_mask) { 02498 indx1_msk = 0; 02499 for (j = 0; j < rank - 1; j++) { 02500 indx1_src += src_off[j]; 02501 indx1_msk += msk_off[j]; 02502 } 02503 } else { 02504 for (j = 0; j < rank - 1; j++) 02505 indx1_src += src_off[j]; 02506 } 02507 for (j = 0; j < src_dim_ext; j++) { 02508 if (use_mask) { 02509 mindx = indx1_msk + (j * msk_dim_strd); 02510 if (LTOB(mask_el_len, &lptr[mindx])) { 02511 sindx = indx1_src + (j * src_dim_strd); 02512 if (r16ptr1[sindx] > cur_maxd) 02513 cur_maxd = r16ptr1[sindx]; 02514 } 02515 } else { 02516 sindx = indx1_src + (j * src_dim_strd); 02517 if (r16ptr1[sindx] > cur_maxd) 02518 cur_maxd = r16ptr1[sindx]; 02519 } 02520 } 02521 if (!scalar) { 02522 indx1_res = 0; 02523 for (j = 0; j < rank - 1; j++) 02524 indx1_res += res_off[j]; 02525 r16ptr2[indx1_res] = cur_maxd; 02526 cur_maxd = -HUGE_REAL16_F90; 02527 } 02528 INCREMENT(); 02529 } 02530 if (scalar) 02531 r16ptr2[0] = cur_maxd; 02532 break; 02533 #endif 02534 02535 default : 02536 _lerror (_LELVL_ABORT, FEINTDTY); 02537 } 02538 } 02539 }