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