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 /* automatically generated file, do not edit */ 00037 00038 #include "f90_intrinsic.h" 00039 00040 void 00041 _PACK( 00042 DopeVectorType *result, 00043 DopeVectorType *array, 00044 DopeVectorType *mask, 00045 DopeVectorType *vector) 00046 { 00047 char * result_p, * result_b ; 00048 char * array_p, * array_b ; 00049 char * mask_p, * mask_b ; 00050 char * vector_p, * vector_b ; 00051 00052 size_t src_extent [MAX_NARY_DIMS] ; 00053 size_t src_stride [MAX_NARY_DIMS] ; 00054 size_t src_offset [MAX_NARY_DIMS] ; 00055 size_t counter[MAX_NARY_DIMS] ; 00056 00057 size_t res_stride [MAX_NARY_DIMS] ; 00058 size_t res_extent [MAX_NARY_DIMS] ; 00059 size_t res_offset [MAX_NARY_DIMS] ; 00060 00061 size_t msk_stride [MAX_NARY_DIMS] ; 00062 size_t msk_extent [MAX_NARY_DIMS] ; 00063 size_t msk_offset [MAX_NARY_DIMS] ; 00064 00065 int32_t j,ii; 00066 char *rp, *ap ; 00067 int32_t res_rank ; 00068 int32_t src_rank = GET_RANK_FROM_DESC(array) - 1; 00069 00070 size_t typ_sz = GET_ELEMENT_SZ_FROM_DESC(array); 00071 00072 size_t a_size,a_stride,r_stride, i,k ; 00073 int8_t zero_szd_source = FALSE; 00074 int8_t byte_aligned = FALSE; 00075 00076 int32_t ddim ; 00077 00078 size_t num_trues ; 00079 int32_t local_alloc ; 00080 size_t tot_ext ; 00081 size_t str_sz ; 00082 00083 size_t src_size ; 00084 size_t m_stride ; 00085 int32_t msk_rank ; 00086 00087 size_t res_sz; 00088 size_t xfer_sz; 00089 size_t tot_sz; 00090 00091 src_size = 1 ; 00092 00093 for ( j = 0 ; j <= src_rank ; j ++ ) { 00094 src_extent[j] = GET_EXTENT_FROM_DESC(array,j) ; 00095 src_stride[j] = GET_STRIDE_FROM_DESC(array,j) ; 00096 src_size *= src_extent[j]; 00097 counter[j] = 0 ; 00098 zero_szd_source = zero_szd_source || (src_extent[j] == 0) ; 00099 } 00100 00101 for ( j = 1 ; j <= src_rank ; j ++ ) 00102 src_offset[j-1] = src_stride[j] - (src_stride [j-1] * (src_extent[j-1])) ; 00103 00104 byte_aligned = GET_BYTEALIGNED_FROM_DESC(array) ; 00105 tot_ext = src_size ; 00106 num_trues = 0 ; 00107 local_alloc = FALSE; 00108 00109 if (vector) 00110 tot_ext = GET_EXTENT_FROM_DESC(vector,0) ; 00111 00112 if (!GET_ASSOCIATED_FROM_DESC(result)) { 00113 00114 size_t nbytes ; 00115 char *p ; 00116 00117 SET_ADDRESS_IN_DESC(result,NULL); 00118 SET_ORIG_BS_IN_DESC(result,NULL) ; 00119 SET_ORIG_SZ_IN_DESC(result,0) ; 00120 00121 p = NULL ; 00122 local_alloc = TRUE ; 00123 nbytes = typ_sz * tot_ext ; 00124 str_sz = MK_STRIDE(byte_aligned,typ_sz); 00125 00126 SET_LBOUND_IN_DESC(result,0,1); 00127 SET_EXTENT_IN_DESC(result,0,tot_ext); 00128 SET_STRMULT_IN_DESC(result,0,str_sz); 00129 00130 if (nbytes > 0 ){ 00131 p = malloc (nbytes); 00132 if (p == NULL) 00133 ERROR(_LELVL_ABORT, FENOMEMY); 00134 00135 SET_ADDRESS_IN_DESC(result,p); 00136 } 00137 00138 SET_CONTIG_IN_DESC(result); 00139 SET_ASSOCIATED_IN_DESC(result); 00140 if (GET_DV_ASCII_FROM_DESC(array)) { 00141 SET_CHARPTR_IN_DESC(result,p,typ_sz); 00142 } 00143 SET_ORIG_BS_IN_DESC(result,p) ; 00144 SET_ORIG_SZ_IN_DESC(result,nbytes * 8) ; 00145 } 00146 00147 res_stride[0] = GET_STRIDE_FROM_DESC(result,0) ; 00148 00149 if (mask != NULL) { 00150 size_t msk_typ_sz; 00151 00152 msk_typ_sz = GET_ELEMENT_SZ_FROM_DESC(mask); 00153 mask_b = (char *) GET_ADDRESS_FROM_DESC(mask) + OFFSET_TO_TF_BYTE(msk_typ_sz); 00154 00155 if (GET_RANK_FROM_DESC(mask) == 0) { 00156 if (*mask_b) { 00157 for ( j = 0 ; j <= src_rank ; j ++ ) { 00158 msk_stride[j] = 0; 00159 msk_offset[j] = 0; 00160 } 00161 } else 00162 zero_szd_source = TRUE; 00163 00164 } else { 00165 00166 for ( j = 0 ; j <= src_rank ; j ++ ) { 00167 msk_stride[j] = GET_STRIDE_FROM_DESC(mask,j) ; 00168 } 00169 for ( j = 1 ; j <= src_rank ; j ++ ) { 00170 msk_offset[j-1] = msk_stride[j] - (msk_stride [j-1] * (src_extent[j-1])) ; 00171 } 00172 } 00173 } 00174 00175 if (zero_szd_source) 00176 return ; 00177 00178 a_size = src_extent[0] ; 00179 a_stride = src_stride[0] ; 00180 r_stride = res_stride[0] ; 00181 m_stride = msk_stride[0] ; 00182 array_p = GET_ADDRESS_FROM_DESC(array); 00183 result_p = GET_ADDRESS_FROM_DESC(result); 00184 mask_p = mask_b ; 00185 00186 if (typ_sz == sizeof(i1) && ALIGNED_i1(array_p) && ALIGNED_i1(result_p)) { 00187 00188 while (counter[src_rank] < src_extent[src_rank] ) { 00189 for ( i = 0 ; i < a_size ; i ++ ) { 00190 if (*mask_p) { 00191 num_trues ++ ; 00192 *(i1 *)result_p = *(i1 *)array_p ; 00193 result_p += r_stride ; 00194 } 00195 mask_p += m_stride ; 00196 array_p += a_stride ; 00197 } 00198 00199 counter[0] = a_size ; 00200 j = 0 ; 00201 while ((counter[j] == src_extent[j]) && (j < src_rank)) { 00202 array_p += src_offset[j] ; 00203 mask_p += msk_offset[j] ; 00204 counter[j+1]++ ; 00205 counter[j] = 0 ; 00206 j ++ ; 00207 } 00208 } 00209 00210 { 00211 00212 size_t v_stride,ll1,ll2 ; 00213 00214 if (vector != NULL) { 00215 result_b = GET_ADDRESS_FROM_DESC(result); 00216 vector_b = GET_ADDRESS_FROM_DESC(vector) ; 00217 v_stride = GET_STRIDE_FROM_DESC(vector,0) ; 00218 ll1 = (result_p-result_b)/r_stride ; 00219 vector_p = vector_b + (v_stride * ll1) ; 00220 ll2 = GET_EXTENT_FROM_DESC(vector,0) ; 00221 if (ALIGNED_i1(vector_p)) { 00222 for ( i = 0 ; i < ll2-ll1 ; i ++ ) { 00223 *(i1 *)result_p = *(i1 *)vector_p ; 00224 result_p += r_stride ; 00225 vector_p += v_stride ; 00226 } 00227 } else { 00228 ap = vector_p ; 00229 rp = result_p ; 00230 for (j = 0 ; j < typ_sz ; j ++) *rp++ = *ap ++ ; 00231 result_p += r_stride ; 00232 vector_p += v_stride ; 00233 } 00234 00235 } else if (local_alloc) { 00236 SET_EXTENT_IN_DESC(result,0,num_trues); 00237 } 00238 } 00239 } else if (typ_sz == sizeof(i2) && ALIGNED_i2(array_p) && ALIGNED_i2(result_p) ) { 00240 00241 while (counter[src_rank] < src_extent[src_rank] ) { 00242 for ( i = 0 ; i < a_size ; i ++ ) { 00243 if (*mask_p) { 00244 num_trues ++ ; 00245 *(i2 *)result_p = *(i2 *)array_p ; 00246 result_p += r_stride ; 00247 } 00248 mask_p += m_stride ; 00249 array_p += a_stride ; 00250 } 00251 00252 counter[0] = a_size ; 00253 j = 0 ; 00254 while ((counter[j] == src_extent[j]) && (j < src_rank)) { 00255 array_p += src_offset[j] ; 00256 mask_p += msk_offset[j] ; 00257 counter[j+1]++ ; 00258 counter[j] = 0 ; 00259 j ++ ; 00260 } 00261 } 00262 00263 { 00264 00265 size_t v_stride,ll1,ll2 ; 00266 00267 if (vector != NULL) { 00268 result_b = GET_ADDRESS_FROM_DESC(result); 00269 vector_b = GET_ADDRESS_FROM_DESC(vector) ; 00270 v_stride = GET_STRIDE_FROM_DESC(vector,0) ; 00271 ll1 = (result_p-result_b)/r_stride ; 00272 vector_p = vector_b + (v_stride * ll1) ; 00273 ll2 = GET_EXTENT_FROM_DESC(vector,0) ; 00274 if (ALIGNED_i2(vector_p)) { 00275 for ( i = 0 ; i < ll2-ll1 ; i ++ ) { 00276 *(i2 *)result_p = *(i2 *)vector_p ; 00277 result_p += r_stride ; 00278 vector_p += v_stride ; 00279 } 00280 } else { 00281 ap = vector_p ; 00282 rp = result_p ; 00283 for (j = 0 ; j < typ_sz ; j ++) *rp++ = *ap ++ ; 00284 result_p += r_stride ; 00285 vector_p += v_stride ; 00286 } 00287 00288 } else if (local_alloc) { 00289 SET_EXTENT_IN_DESC(result,0,num_trues); 00290 } 00291 } 00292 } else if (typ_sz == sizeof(r4) && ALIGNED_r4(array_p) && ALIGNED_r4(result_p) ) { 00293 00294 while (counter[src_rank] < src_extent[src_rank] ) { 00295 for ( i = 0 ; i < a_size ; i ++ ) { 00296 if (*mask_p) { 00297 num_trues ++ ; 00298 *(r4 *)result_p = *(r4 *)array_p ; 00299 result_p += r_stride ; 00300 } 00301 mask_p += m_stride ; 00302 array_p += a_stride ; 00303 } 00304 00305 counter[0] = a_size ; 00306 j = 0 ; 00307 while ((counter[j] == src_extent[j]) && (j < src_rank)) { 00308 array_p += src_offset[j] ; 00309 mask_p += msk_offset[j] ; 00310 counter[j+1]++ ; 00311 counter[j] = 0 ; 00312 j ++ ; 00313 } 00314 } 00315 00316 { 00317 00318 size_t v_stride,ll1,ll2 ; 00319 00320 if (vector != NULL) { 00321 result_b = GET_ADDRESS_FROM_DESC(result); 00322 vector_b = GET_ADDRESS_FROM_DESC(vector) ; 00323 v_stride = GET_STRIDE_FROM_DESC(vector,0) ; 00324 ll1 = (result_p-result_b)/r_stride ; 00325 vector_p = vector_b + (v_stride * ll1) ; 00326 ll2 = GET_EXTENT_FROM_DESC(vector,0) ; 00327 if (ALIGNED_r4(vector_p)) { 00328 for ( i = 0 ; i < ll2-ll1 ; i ++ ) { 00329 *(r4 *)result_p = *(r4 *)vector_p ; 00330 result_p += r_stride ; 00331 vector_p += v_stride ; 00332 } 00333 } else { 00334 ap = vector_p ; 00335 rp = result_p ; 00336 for (j = 0 ; j < typ_sz ; j ++) *rp++ = *ap ++ ; 00337 result_p += r_stride ; 00338 vector_p += v_stride ; 00339 } 00340 00341 } else if (local_alloc) { 00342 SET_EXTENT_IN_DESC(result,0,num_trues); 00343 } 00344 } 00345 } else if (typ_sz == sizeof(r8) && ALIGNED_r8(array_p) && ALIGNED_r8(result_p) ) { 00346 00347 while (counter[src_rank] < src_extent[src_rank] ) { 00348 for ( i = 0 ; i < a_size ; i ++ ) { 00349 if (*mask_p) { 00350 num_trues ++ ; 00351 *(r8 *)result_p = *(r8 *)array_p ; 00352 result_p += r_stride ; 00353 } 00354 mask_p += m_stride ; 00355 array_p += a_stride ; 00356 } 00357 00358 counter[0] = a_size ; 00359 j = 0 ; 00360 while ((counter[j] == src_extent[j]) && (j < src_rank)) { 00361 array_p += src_offset[j] ; 00362 mask_p += msk_offset[j] ; 00363 counter[j+1]++ ; 00364 counter[j] = 0 ; 00365 j ++ ; 00366 } 00367 } 00368 00369 { 00370 00371 size_t v_stride,ll1,ll2 ; 00372 00373 if (vector != NULL) { 00374 result_b = GET_ADDRESS_FROM_DESC(result); 00375 vector_b = GET_ADDRESS_FROM_DESC(vector) ; 00376 v_stride = GET_STRIDE_FROM_DESC(vector,0) ; 00377 ll1 = (result_p-result_b)/r_stride ; 00378 vector_p = vector_b + (v_stride * ll1) ; 00379 ll2 = GET_EXTENT_FROM_DESC(vector,0) ; 00380 if (ALIGNED_r8(vector_p)) { 00381 for ( i = 0 ; i < ll2-ll1 ; i ++ ) { 00382 *(r8 *)result_p = *(r8 *)vector_p ; 00383 result_p += r_stride ; 00384 vector_p += v_stride ; 00385 } 00386 } else { 00387 ap = vector_p ; 00388 rp = result_p ; 00389 for (j = 0 ; j < typ_sz ; j ++) *rp++ = *ap ++ ; 00390 result_p += r_stride ; 00391 vector_p += v_stride ; 00392 } 00393 00394 } else if (local_alloc) { 00395 SET_EXTENT_IN_DESC(result,0,num_trues); 00396 } 00397 } 00398 } else if (typ_sz == sizeof(r16) && ALIGNED_r16(array_p) && ALIGNED_r16(result_p) ) { 00399 00400 while (counter[src_rank] < src_extent[src_rank] ) { 00401 for ( i = 0 ; i < a_size ; i ++ ) { 00402 if (*mask_p) { 00403 num_trues ++ ; 00404 *(r16 *)result_p = *(r16 *)array_p ; 00405 result_p += r_stride ; 00406 } 00407 mask_p += m_stride ; 00408 array_p += a_stride ; 00409 } 00410 00411 counter[0] = a_size ; 00412 j = 0 ; 00413 while ((counter[j] == src_extent[j]) && (j < src_rank)) { 00414 array_p += src_offset[j] ; 00415 mask_p += msk_offset[j] ; 00416 counter[j+1]++ ; 00417 counter[j] = 0 ; 00418 j ++ ; 00419 } 00420 } 00421 00422 { 00423 00424 size_t v_stride,ll1,ll2 ; 00425 00426 if (vector != NULL) { 00427 result_b = GET_ADDRESS_FROM_DESC(result); 00428 vector_b = GET_ADDRESS_FROM_DESC(vector) ; 00429 v_stride = GET_STRIDE_FROM_DESC(vector,0) ; 00430 ll1 = (result_p-result_b)/r_stride ; 00431 vector_p = vector_b + (v_stride * ll1) ; 00432 ll2 = GET_EXTENT_FROM_DESC(vector,0) ; 00433 if (ALIGNED_r16(vector_p)) { 00434 for ( i = 0 ; i < ll2-ll1 ; i ++ ) { 00435 *(r16 *)result_p = *(r16 *)vector_p ; 00436 result_p += r_stride ; 00437 vector_p += v_stride ; 00438 } 00439 } else { 00440 ap = vector_p ; 00441 rp = result_p ; 00442 for (j = 0 ; j < typ_sz ; j ++) *rp++ = *ap ++ ; 00443 result_p += r_stride ; 00444 vector_p += v_stride ; 00445 } 00446 00447 } else if (local_alloc) { 00448 SET_EXTENT_IN_DESC(result,0,num_trues); 00449 } 00450 } 00451 } else { 00452 while (counter[src_rank] < src_extent[src_rank] ) { 00453 for ( i = 0 ; i < a_size ; i ++ ) { 00454 if (*mask_p) { 00455 num_trues ++ ; 00456 ap = array_p ; 00457 rp = result_p ; 00458 if (typ_sz > BIGDEFAULTSZ) 00459 (void) memcpy (rp, ap, typ_sz); 00460 else 00461 for (j = 0 ; j < typ_sz ; j ++) *rp++ = *ap ++ ; 00462 result_p += r_stride ; 00463 } 00464 mask_p += m_stride ; 00465 array_p += a_stride ; 00466 } 00467 00468 counter[0] = a_size ; 00469 j = 0 ; 00470 while ((counter[j] == src_extent[j]) && (j < src_rank)) { 00471 array_p += src_offset[j] ; 00472 mask_p += msk_offset[j] ; 00473 counter[j+1]++ ; 00474 counter[j] = 0 ; 00475 j ++ ; 00476 } 00477 } 00478 00479 { 00480 00481 size_t v_stride,ll1,ll2 ; 00482 00483 if (vector != NULL) { 00484 result_b = GET_ADDRESS_FROM_DESC(result); 00485 vector_b = GET_ADDRESS_FROM_DESC(vector) ; 00486 v_stride = GET_STRIDE_FROM_DESC(vector,0) ; 00487 ll1 = (result_p-result_b)/r_stride ; 00488 vector_p = vector_b + (v_stride * ll1) ; 00489 ll2 = GET_EXTENT_FROM_DESC(vector,0) ; 00490 00491 for ( i = 0 ; i < ll2-ll1 ; i ++ ) { 00492 ap = vector_p ; 00493 rp = result_p ; 00494 if (typ_sz > BIGDEFAULTSZ) 00495 (void) memcpy (rp, ap, typ_sz); 00496 else 00497 for (j = 0 ; j < typ_sz ; j ++) *rp++ = *ap ++ ; 00498 result_p += r_stride ; 00499 vector_p += v_stride ; 00500 } 00501 } else if (local_alloc) { 00502 SET_EXTENT_IN_DESC(result,0,num_trues); 00503 } 00504 } 00505 } 00506 }