Open64 (mfef90, whirl2f, and IR tools)  TAG: version-openad; SVN changeset: 916
pack_gen.c
Go to the documentation of this file.
00001 /*
00002 
00003   Copyright (C) 2000, 2001 Silicon Graphics, Inc.  All Rights Reserved.
00004 
00005   This program is free software; you can redistribute it and/or modify it
00006   under the terms of version 2.1 of the GNU Lesser General Public License 
00007   as published by the Free Software Foundation.
00008 
00009   This program is distributed in the hope that it would be useful, but
00010   WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
00012 
00013   Further, this software is distributed without any warranty that it is
00014   free of the rightful claim of any third person regarding infringement 
00015   or the like.  Any license provided herein, whether implied or 
00016   otherwise, applies only to this software file.  Patent licenses, if
00017   any, provided herein do not apply to combinations of this program with 
00018   other software, or any other product whatsoever.  
00019 
00020   You should have received a copy of the GNU Lesser General Public 
00021   License along with this program; if not, write the Free Software 
00022   Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, 
00023   USA.
00024 
00025   Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pky,
00026   Mountain View, CA 94043, or:
00027 
00028   http://www.sgi.com
00029 
00030   For further information regarding this notice, see:
00031 
00032   http://oss.sgi.com/projects/GenInfo/NoticeExplan
00033 
00034 */
00035 
00036 /* 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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines